This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch 4_0_X in repository https://gitbox.apache.org/repos/asf/syncope.git
commit 091050d20a0b8a0ad04e5bcabdf8219fc677f530 Author: Francesco Chicchiriccò <[email protected]> AuthorDate: Thu Oct 30 08:35:11 2025 +0100 [SYNCOPE-1925] Review setWindowClosedReloadCallback --- .../authprofiles/AuthProfileDirectoryPanel.java | 5 +- .../clientapps/ClientAppDirectoryPanel.java | 7 +- .../console/panels/AMSessionDirectoryPanel.java | 2 +- .../panels/SAML2IdPEntityDirectoryPanel.java | 6 +- .../console/panels/SRARouteDirectoryPanel.java | 7 +- ...MergeLinkedAccountsReviewPanel_fr_CA.properties | 2 +- .../MergeLinkedAccountsReviewPanel_it.properties | 10 +- .../MergeLinkedAccountsReviewPanel_ja.properties | 2 +- ...MergeLinkedAccountsReviewPanel_pt_BR.properties | 2 +- .../MergeLinkedAccountsReviewPanel_ru.properties | 2 +- .../apache/syncope/client/ui/commons/DateOps.java | 4 +- .../notifications/MailTemplateDirectoryPanel.java | 5 +- .../console/panels/CommandDirectoryPanel.java | 6 +- .../client/console/panels/DirectoryPanel.java | 35 ++++--- .../console/panels/DomainDirectoryPanel.java | 9 +- .../console/panels/DynRealmDirectoryPanel.java | 5 +- .../client/console/panels/GroupDirectoryPanel.java | 6 +- .../panels/ImplementationDirectoryPanel.java | 4 + .../panels/NetworkServiceDirectoryPanel.java | 5 +- .../console/panels/SecurityQuestionsPanel.java | 5 +- .../client/console/panels/UserDirectoryPanel.java | 7 +- .../console/policies/PolicyDirectoryPanel.java | 5 +- .../markup/html/bootstrap/dialog/BaseModal.java | 11 +- .../wicket/markup/html/form/ActionLink.java | 3 - .../markup/html/form/ActionLinksTogglePanel.java | 12 ++- .../wicket/markup/html/form/ActionPanel.java | 18 +--- .../syncope/client/console/widgets/JobWidget.java | 4 +- .../org/apache/syncope/core/logic/UserLogic.java | 3 +- .../core/persistence/jpa/inner/AnySearchTest.java | 113 +++++++++------------ .../persistence/neo4j/inner/AnySearchTest.java | 84 +++++++++++---- .../panels/UserRequestFormDirectoryPanel.java | 4 + .../panels/OIDCProvidersDirectoryPanel.java | 2 +- .../console/panels/SAML2IdPsDirectoryPanel.java | 7 +- .../apache/syncope/fit/console/BatchesITCase.java | 46 ++++----- .../syncope/fit/console/LinkedAccountsITCase.java | 33 +++--- .../org/apache/syncope/fit/core/SearchITCase.java | 2 +- 36 files changed, 241 insertions(+), 242 deletions(-) diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/authprofiles/AuthProfileDirectoryPanel.java b/client/am/console/src/main/java/org/apache/syncope/client/console/authprofiles/AuthProfileDirectoryPanel.java index fa3dde612d..ed955350ac 100644 --- a/client/am/console/src/main/java/org/apache/syncope/client/console/authprofiles/AuthProfileDirectoryPanel.java +++ b/client/am/console/src/main/java/org/apache/syncope/client/console/authprofiles/AuthProfileDirectoryPanel.java @@ -80,10 +80,7 @@ public class AuthProfileDirectoryPanel } }; authProfileModal.size(Modal.Size.Large); - authProfileModal.setWindowClosedCallback(target -> { - updateResultTable(target); - authProfileModal.show(false); - }); + setWindowClosedReloadCallback(authProfileModal, true); addOuterObject(authProfileModal); disableCheckBoxes(); diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel.java b/client/am/console/src/main/java/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel.java index 8701492598..d546ea7884 100644 --- a/client/am/console/src/main/java/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel.java +++ b/client/am/console/src/main/java/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel.java @@ -97,10 +97,7 @@ public abstract class ClientAppDirectoryPanel<T extends ClientAppTO> modal.addSubmitButton(); modal.size(Modal.Size.Large); - modal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(modal, true); setFooterVisibility(true); propertiesModal = new BaseModal<>(Constants.OUTER) { @@ -114,7 +111,7 @@ public abstract class ClientAppDirectoryPanel<T extends ClientAppTO> } }; propertiesModal.size(Modal.Size.Large); - propertiesModal.setWindowClosedCallback(target -> propertiesModal.show(false)); + setWindowClosedReloadCallback(propertiesModal); addOuterObject(propertiesModal); disableCheckBoxes(); diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.java b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.java index 9db0f0b713..852f53bf9d 100644 --- a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.java +++ b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/AMSessionDirectoryPanel.java @@ -92,7 +92,7 @@ public class AMSessionDirectoryPanel } }; viewModal.size(Modal.Size.Extra_large); - viewModal.setWindowClosedCallback(target -> viewModal.show(false)); + setWindowClosedReloadCallback(viewModal); addOuterObject(viewModal); initResultTable(); diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPEntityDirectoryPanel.java b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPEntityDirectoryPanel.java index 735d7cc99b..279fa58bb0 100644 --- a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPEntityDirectoryPanel.java +++ b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPEntityDirectoryPanel.java @@ -111,11 +111,7 @@ public class SAML2IdPEntityDirectoryPanel extends DirectoryPanel< modal.size(Modal.Size.Large); modal.addSubmitButton(); - - modal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(modal, true); addNewItemPanelBuilder(new SAML2IdPEntityWizardBuilder(new SAML2IdPEntityTO(), restClient, pageRef), false); diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SRARouteDirectoryPanel.java b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SRARouteDirectoryPanel.java index a116ccf53f..280026d2e8 100644 --- a/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SRARouteDirectoryPanel.java +++ b/client/am/console/src/main/java/org/apache/syncope/client/console/panels/SRARouteDirectoryPanel.java @@ -61,13 +61,10 @@ public class SRARouteDirectoryPanel modal.size(Modal.Size.Large); modal.addSubmitButton(); - - modal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(modal, true); addNewItemPanelBuilder(new SRARouteWizardBuilder(new SRARouteTO(), restClient, pageRef), true); + initResultTable(); } diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_fr_CA.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_fr_CA.properties index c2d89faeaf..3fd6639997 100644 --- a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_fr_CA.properties +++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_fr_CA.properties @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. mergeLinkedAccounts.reviewAccounts.title=Preview finalized linked accounts -connObjectKeyValue=Connector +connObjectKeyValue=Connector Key resource=Resource key=Key username=Username diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_it.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_it.properties index c2d89faeaf..bd2fcc6be8 100644 --- a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_it.properties +++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_it.properties @@ -14,9 +14,9 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -mergeLinkedAccounts.reviewAccounts.title=Preview finalized linked accounts -connObjectKeyValue=Connector -resource=Resource -key=Key +mergeLinkedAccounts.reviewAccounts.title=Anteprima linked account +connObjectKeyValue=Chiave esterna +resource=Risorsa +key=Chiave interna username=Username -suspended=Suspended +suspended=Sospeso diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_ja.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_ja.properties index c2d89faeaf..3fd6639997 100644 --- a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_ja.properties +++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_ja.properties @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. mergeLinkedAccounts.reviewAccounts.title=Preview finalized linked accounts -connObjectKeyValue=Connector +connObjectKeyValue=Connector Key resource=Resource key=Key username=Username diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_pt_BR.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_pt_BR.properties index c2d89faeaf..3fd6639997 100644 --- a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_pt_BR.properties +++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_pt_BR.properties @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. mergeLinkedAccounts.reviewAccounts.title=Preview finalized linked accounts -connObjectKeyValue=Connector +connObjectKeyValue=Connector Key resource=Resource key=Key username=Username diff --git a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_ru.properties b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_ru.properties index c2d89faeaf..3fd6639997 100644 --- a/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_ru.properties +++ b/client/idm/console/src/main/resources/org/apache/syncope/client/console/wizards/any/MergeLinkedAccountsReviewPanel_ru.properties @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. mergeLinkedAccounts.reviewAccounts.title=Preview finalized linked accounts -connObjectKeyValue=Connector +connObjectKeyValue=Connector Key resource=Resource key=Key username=Username diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DateOps.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DateOps.java index 4e0d591cb2..1f23abe89e 100644 --- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DateOps.java +++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DateOps.java @@ -47,11 +47,11 @@ public final class DateOps { } public String format(final OffsetDateTime date) { - return Optional.ofNullable(date).map(v -> fdf.format(convert(date))).orElse(StringUtils.EMPTY); + return Optional.ofNullable(date).map(v -> fdf.format(convert(v))).orElse(StringUtils.EMPTY); } public String format(final ZonedDateTime date) { - return Optional.ofNullable(date).map(v -> fdf.format(convert(date))).orElse(StringUtils.EMPTY); + return Optional.ofNullable(date).map(v -> fdf.format(convert(v))).orElse(StringUtils.EMPTY); } public String format(final LocalDateTime date) { diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java index 51d897be10..b6398da899 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java @@ -73,10 +73,7 @@ public class MailTemplateDirectoryPanel modal.size(Modal.Size.Small); modal.addSubmitButton(); - modal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(modal, true); setFooterVisibility(true); addOuterObject(utilityModal); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/CommandDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/CommandDirectoryPanel.java index e21795f5ba..c6683bba7f 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/CommandDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/CommandDirectoryPanel.java @@ -66,11 +66,7 @@ public class CommandDirectoryPanel disableCheckBoxes(); modal.size(Modal.Size.Large); - - modal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(modal, true); addNewItemPanelBuilder(new CommandWizardBuilder(new CommandTO(), restClient, pageRef), false); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java index 1ed239555c..f5fa77fbf0 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java @@ -35,7 +35,6 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel; import org.apache.syncope.client.console.wizards.WizardMgtPanel; import org.apache.syncope.client.ui.commons.Constants; import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior; -import org.apache.syncope.client.ui.commons.panels.WizardModalPanel; import org.apache.syncope.client.ui.commons.rest.RestClient; import org.apache.syncope.common.lib.types.IdRepoEntitlement; import org.apache.wicket.PageReference; @@ -178,16 +177,13 @@ public abstract class DirectoryPanel< rows = PreferenceManager.getPaginatorRows(paginatorRowsKey()); - modal.setWindowClosedCallback(target -> { - if (actionTogglePanel.isVisibleInHierarchy() && modal.getContent() instanceof WizardModalPanel) { - actionTogglePanel.updateHeader(target, WizardModalPanel.class.cast(modal.getContent()).getItem()); - } - modal.show(false); - }); + setWindowClosedReloadCallback(modal); - setWindowClosedReloadCallback(altDefaultModal); altDefaultModal.size(Modal.Size.Default); + setWindowClosedReloadCallback(altDefaultModal); + displayAttributeModal.size(Modal.Size.Default); + displayAttributeModal.addSubmitButton(); displayAttributeModal.setWindowClosedCallback(target -> { EventDataWrapper data = new EventDataWrapper(); data.setTarget(target); @@ -195,11 +191,27 @@ public abstract class DirectoryPanel< send(DirectoryPanel.this, Broadcast.EXACT, data); - displayAttributeModal.size(Modal.Size.Default); modal.show(false); }); - displayAttributeModal.size(Modal.Size.Default); - displayAttributeModal.addSubmitButton(); + } + + @Override + protected void setWindowClosedReloadCallback(final BaseModal<?> baseModal) { + setWindowClosedReloadCallback(baseModal, false); + } + + protected void setWindowClosedReloadCallback(final BaseModal<?> baseModal, final boolean updateResultTable) { + baseModal.setWindowClosedCallback(target -> { + if (actionTogglePanel.isVisibleInHierarchy()) { + actionTogglePanel.toggle(target, false); + } + + if (updateResultTable) { + updateResultTable(target); + } + + baseModal.show(false); + }); } protected abstract DP dataProvider(); @@ -344,7 +356,6 @@ public abstract class DirectoryPanel< @Override public void onEvent(final IEvent<?> event) { if (event.getPayload() instanceof final EventDataWrapper data) { - if (data.getRows() < 1) { updateResultTable(data.isCreate()); } else { diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java index 6565ca4b1a..24fc357842 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java @@ -70,15 +70,16 @@ public class DomainDirectoryPanel extends DirectoryPanel<Domain, Domain, DomainP modal.size(Modal.Size.Large); modal.setWindowClosedCallback(target -> { + if (actionTogglePanel.isVisibleInHierarchy()) { + actionTogglePanel.toggle(target, false); + } + updateResultTable(target); modal.show(false); }); addOuterObject(utilityModal); - utilityModal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(utilityModal, true); utilityModal.size(Modal.Size.Small); utilityModal.addSubmitButton(); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java index d720bc331c..3968b02bf0 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java @@ -65,10 +65,7 @@ public class DynRealmDirectoryPanel extends modal.size(Modal.Size.Large); modal.addSubmitButton(); - modal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(modal, true); setFooterVisibility(true); AjaxLink<Void> newDynRealmlLink = new AjaxLink<>("add") { diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java index f081fec8e8..79afc603d7 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java @@ -111,12 +111,12 @@ public class GroupDirectoryPanel extends AnyDirectoryPanel<GroupTO, GroupRestCli super(id, builder, wizardInModal); typeExtensionsModal.size(Modal.Size.Large); - addOuterObject(typeExtensionsModal); - setWindowClosedReloadCallback(typeExtensionsModal); typeExtensionsModal.addSubmitButton(); + setWindowClosedReloadCallback(typeExtensionsModal); + addOuterObject(typeExtensionsModal); - addOuterObject(membersModal); membersModal.size(Modal.Size.Large); + addOuterObject(membersModal); membersTogglePanel = new MembersTogglePanel(page.getPageReference()) { diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java index e73ae45928..7fac40727c 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java @@ -74,6 +74,10 @@ public class ImplementationDirectoryPanel extends DirectoryPanel< modal.size(Modal.Size.Large); modal.addSubmitButton(); modal.setWindowClosedCallback(target -> { + if (actionTogglePanel.isVisibleInHierarchy()) { + actionTogglePanel.toggle(target, false); + } + implementation.setEngine(null); updateResultTable(target); modal.show(false); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/NetworkServiceDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/NetworkServiceDirectoryPanel.java index e16594d352..2e2051bb89 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/NetworkServiceDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/NetworkServiceDirectoryPanel.java @@ -68,10 +68,7 @@ public class NetworkServiceDirectoryPanel extends DirectoryPanel< modal.size(Modal.Size.Large); modal.addSubmitButton(); - modal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(modal, true); setFooterVisibility(true); initResultTable(); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java index 3dc5e210bc..94c7aeba8f 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java @@ -72,10 +72,7 @@ public class SecurityQuestionsPanel extends DirectoryPanel< modal.addSubmitButton(); modal.size(Modal.Size.Large); - modal.setWindowClosedCallback(target -> { - modal.show(false); - target.add(container); - }); + setWindowClosedReloadCallback(modal, true); setFooterVisibility(true); this.addNewItemPanelBuilder( diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java index 25fdfc1303..6393f31fcf 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java @@ -74,10 +74,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient protected UserDirectoryPanel(final String id, final Builder builder, final boolean wizardInModal) { super(id, builder, wizardInModal); - altDefaultModal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(altDefaultModal, true); } @Override @@ -224,7 +221,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient SyncopeWebApplication.get().getAnyDirectoryPanelAdditionalActionLinksProvider().get( model, realm, - altDefaultModal, + modal, getString("any.edit", new Model<>(new UserWrapper(model.getObject()))), this, pageRef).forEach(panel::add); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java index e2ca9f4c09..4924685f17 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java @@ -110,10 +110,7 @@ public abstract class PolicyDirectoryPanel<T extends PolicyTO> modal.addSubmitButton(); modal.size(Modal.Size.Large); - modal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(modal, true); setFooterVisibility(true); disableCheckBoxes(); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java index e2248a7f53..46f156ddb2 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java @@ -24,6 +24,7 @@ import de.agilecoders.wicket.extensions.markup.html.bootstrap.behavior.Draggable import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.apache.syncope.client.console.panels.AbstractModalPanel; import org.apache.syncope.client.console.wicket.ajax.form.IndicatorModalCloseBehavior; import org.apache.syncope.client.console.wicket.markup.html.bootstrap.buttons.DefaultModalCloseButton; @@ -143,8 +144,8 @@ public class BaseModal<T extends Serializable> extends Modal<T> { } public BaseModal<T> setContent(final ModalPanel component) { - if (component instanceof Panel) { - return setInternalContent(Panel.class.cast(component)); + if (component instanceof Panel panel) { + return setInternalContent(panel); } throw new IllegalArgumentException("Panel instance is required"); } @@ -185,9 +186,7 @@ public class BaseModal<T extends Serializable> extends Modal<T> { @Override protected void onClose(final IPartialPageRequestHandler target) { - if (windowClosedCallback != null) { - windowClosedCallback.onClose((AjaxRequestTarget) target); - } + Optional.ofNullable(windowClosedCallback).ifPresent(callback -> callback.onClose((AjaxRequestTarget) target)); } public AjaxSubmitLink addSubmitButton() { @@ -360,7 +359,7 @@ public class BaseModal<T extends Serializable> extends Modal<T> { + (showImmediately() ? ".show()" : "") + ";"; } - + /** * adds close handler to initializer script, if use of close handler has been defined. * diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java index a04d0a9b27..faaaf2f3d4 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java @@ -129,9 +129,6 @@ public abstract class ActionLink<T extends Serializable> implements Serializable public abstract void onClick(AjaxRequestTarget target, T modelObject); - public void postClick() { - } - public boolean feedbackPanelAutomaticReload() { return reloadFeedbackPanel; } diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java index 7f42f86846..983c6f039d 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java @@ -33,6 +33,7 @@ import org.apache.syncope.client.ui.commons.status.StatusBean; import org.apache.syncope.client.ui.commons.wizards.any.EntityWrapper; import org.apache.syncope.client.ui.commons.wizards.any.UserWrapper; import org.apache.syncope.common.keymaster.client.api.model.Domain; +import org.apache.syncope.common.keymaster.client.api.model.NetworkService; import org.apache.syncope.common.lib.Attr; import org.apache.syncope.common.lib.command.CommandTO; import org.apache.syncope.common.lib.policy.PolicyTO; @@ -71,7 +72,7 @@ public class ActionLinksTogglePanel<T extends Serializable> extends TogglePanel< container.add(getEmptyFragment()); } - public void updateHeader(final AjaxRequestTarget target, final Serializable modelObject) { + protected void updateHeader(final AjaxRequestTarget target, final Serializable modelObject) { final String header; if (modelObject instanceof final UserTO userTO) { header = userTO.getUsername(); @@ -104,19 +105,20 @@ public class ActionLinksTogglePanel<T extends Serializable> extends TogglePanel< } else if (modelObject instanceof final CommandWrapper commandWrapper) { header = commandWrapper.getCommand().getKey(); } else if (modelObject instanceof final JobTO jobTO) { - header = jobTO.getRefKey() == null - ? jobTO.getRefDesc() : jobTO.getRefKey(); + header = jobTO.getRefKey() == null ? jobTO.getRefDesc() : jobTO.getRefKey(); } else if (modelObject instanceof final ToggleableTarget toggleableTarget) { header = toggleableTarget.getAnyType(); } else if (modelObject instanceof final Domain domain) { header = domain.getKey(); } else if (modelObject instanceof final CommandTO commandTO) { header = commandTO.getKey(); + } else if (modelObject instanceof final NetworkService networkService) { + header = networkService.getAddress(); } else if (modelObject instanceof final NamedEntityTO entity) { header = entity.getName(); } else if (modelObject instanceof final EntityTO entityTO) { header = entityTO.getKey(); - } else if (modelObject instanceof final EntityWrapper entityWrapper) { + } else if (modelObject instanceof final EntityWrapper<?> entityWrapper) { EntityTO inner = entityWrapper.getInnerObject(); header = inner instanceof final NamedEntityTO namedEntityTO ? namedEntityTO.getName() : inner.getKey(); } else { @@ -133,7 +135,7 @@ public class ActionLinksTogglePanel<T extends Serializable> extends TogglePanel< updateHeader(target, modelObject); - modal.setWindowClosedCallback(t -> modal.show(false)); + setWindowClosedReloadCallback(modal); Fragment frag = new Fragment("actions", "actionsFragment", this); frag.setOutputMarkupId(true); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java index 20bd29068a..8b7e01ed8a 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java @@ -169,24 +169,16 @@ public final class ActionPanel<T extends Serializable> extends Panel { Optional.ofNullable(action.getIcon()).ifPresent(i -> actionIcon.add(new AttributeModifier("class", i))); - this.disableIndicator = !action.hasIndicator(); + disableIndicator = !action.hasIndicator(); // --------------------------- } protected void beforeOnClick(final AjaxRequestTarget target) { - switch (this.action.getType()) { - case DELETE: - case CREATE: - case MEMBERS: - case MAPPING: - case SET_LATEST_SYNC_TOKEN: - case REMOVE_SYNC_TOKEN: - case EDIT_APPROVAL: - case CLAIM: + switch (action.getType()) { + case DELETE, CREATE, MEMBERS, MAPPING, SET_LATEST_SYNC_TOKEN, REMOVE_SYNC_TOKEN, EDIT_APPROVAL, CLAIM -> send(this, Broadcast.BUBBLE, new ActionLinksTogglePanel.ActionLinkToggleCloseEventPayload(target)); - break; - default: - break; + default -> { + } } } } diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java index 59f219287b..f5556a5556 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java @@ -273,11 +273,11 @@ public class JobWidget extends BaseWidget { @Override public void onEvent(final IEvent<?> event) { - if (event.getPayload() instanceof JobActionPanel.JobActionPayload) { + if (event.getPayload() instanceof JobActionPanel.JobActionPayload payload) { available.clear(); available.addAll(getUpdatedAvailable()); availableJobsPanel.modelChanged(); - JobActionPanel.JobActionPayload.class.cast(event.getPayload()).getTarget().add(availableJobsPanel); + payload.getTarget().add(availableJobsPanel); } } diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java index ffcbaa991d..f419e91a2a 100644 --- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java +++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java @@ -591,8 +591,7 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> { build(); if (changepwd) { - req.setPassword(new PasswordPatch.Builder(). - value(password).onSyncope(false).resources(resources).build()); + req.setPassword(new PasswordPatch.Builder().value(password).onSyncope(false).resources(resources).build()); } return update(req, nullPriorityAsync); diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java index 1a1f45812c..a7e2b750d5 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java @@ -58,6 +58,7 @@ import org.apache.syncope.core.persistence.api.dao.search.ResourceCond; import org.apache.syncope.core.persistence.api.dao.search.RoleCond; import org.apache.syncope.core.persistence.api.dao.search.SearchCond; import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.PlainAttr; import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership; @@ -960,50 +961,44 @@ public class AnySearchTest extends AbstractTest { } @Test - public void issueSYNCOPE1906() { - User bellini = userDAO.findByUsername("bellini").orElseThrow(); - + void issueSYNCOPE1906() { PlainSchema ctypeSchema = plainSchemaDAO.findById("ctype").orElseThrow(); - assertNotNull(ctypeSchema); - - userDAO.save(addPlainAttr(bellini, ctypeSchema, "aa1")); - - User puccini = userDAO.findByUsername("puccini").orElseThrow(); - assertNotNull(bellini); - userDAO.save(addPlainAttr(puccini, ctypeSchema, "aa2")); + AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.USER); - User verdi = userDAO.findByUsername("verdi").orElseThrow(); - assertNotNull(verdi); + anyUtils.addAttr(validator, userDAO.findKey("bellini").orElseThrow(), ctypeSchema, "aa1"); + assertEquals("aa1", userDAO.findByUsername("bellini").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); - userDAO.save(addPlainAttr(verdi, ctypeSchema, "aa3")); + anyUtils.addAttr(validator, userDAO.findKey("puccini").orElseThrow(), ctypeSchema, "aa2"); + assertEquals("aa2", userDAO.findByUsername("puccini").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); - User vivaldi = userDAO.findByUsername("vivaldi").orElseThrow(); - assertNotNull(vivaldi); + anyUtils.addAttr(validator, userDAO.findKey("verdi").orElseThrow(), ctypeSchema, "aa3"); + assertEquals("aa3", userDAO.findByUsername("verdi").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); - userDAO.save(addPlainAttr(vivaldi, ctypeSchema, "aa4")); + anyUtils.removeAttr(userDAO.findKey("vivaldi").orElseThrow(), ctypeSchema); + anyUtils.addAttr(validator, userDAO.findKey("vivaldi").orElseThrow(), ctypeSchema, "aa4"); + assertEquals("aa4", userDAO.findByUsername("vivaldi").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); - User rossini = userDAO.findByUsername("rossini").orElseThrow(); - assertNotNull(rossini); - - userDAO.save(addPlainAttr(rossini, ctypeSchema, "aa5")); + anyUtils.removeAttr(userDAO.findKey("rossini").orElseThrow(), ctypeSchema); + anyUtils.addAttr(validator, userDAO.findKey("rossini").orElseThrow(), ctypeSchema, "aa5"); + assertEquals("aa5", userDAO.findByUsername("rossini").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); entityManager.flush(); - AnyCond idCond = new AnyCond(AttrCond.Type.ISNOTNULL); - idCond.setSchema("id"); - - List<User> users = - searchDAO.search(SearchCond.of(idCond), List.of(new Sort.Order(Sort.Direction.DESC, "ctype")), - AnyTypeKind.USER); + AnyCond keyCond = new AnyCond(AttrCond.Type.ISNOTNULL); + keyCond.setSchema("key"); - assertEquals("bellini", users.get(4).getUsername()); - assertEquals("puccini", users.get(3).getUsername()); - assertEquals("verdi", users.get(2).getUsername()); - assertEquals("vivaldi", users.get(1).getUsername()); - assertEquals("rossini", users.get(0).getUsername()); + List<User> users = searchDAO.search( + SearchCond.of(keyCond), List.of(new Sort.Order(Sort.Direction.DESC, "ctype")), AnyTypeKind.USER); + assertEquals( + List.of("rossini", "vivaldi", "verdi", "puccini", "bellini"), + users.stream().map(User::getUsername).toList()); - // order by ctype even not searching by it AttrCond surnameCond = new AttrCond(AttrCond.Type.ILIKE); surnameCond.setSchema("surname"); surnameCond.setExpression("%ini"); @@ -1011,50 +1006,34 @@ public class AnySearchTest extends AbstractTest { AttrCond coolCond = new AttrCond(AttrCond.Type.ISNULL); coolCond.setSchema("cool"); - users = searchDAO.search(SearchCond.and(SearchCond.of(surnameCond), SearchCond.of(coolCond)), + // order by ctype even not searching by it + users = searchDAO.search( + SearchCond.and(SearchCond.of(surnameCond), SearchCond.of(coolCond)), List.of(new Sort.Order(Sort.Direction.DESC, "ctype")), AnyTypeKind.USER); - - assertFalse(users.isEmpty()); assertEquals(2, users.size()); - - // order by unique attribute - users = searchDAO.search(SearchCond.of(idCond), List.of(new Sort.Order(Sort.Direction.DESC, "fullname")), - AnyTypeKind.USER); - assertEquals("vivaldi", users.get(4).getUsername()); - assertEquals("puccini", users.get(3).getUsername()); - assertEquals("rossini", users.get(2).getUsername()); - assertEquals("verdi", users.get(1).getUsername()); - assertEquals("bellini", users.get(0).getUsername()); + // order by unique attribute + users = searchDAO.search( + SearchCond.of(keyCond), List.of(new Sort.Order(Sort.Direction.DESC, "fullname")), AnyTypeKind.USER); + assertEquals( + List.of("bellini", "verdi", "rossini", "puccini", "vivaldi"), + users.stream().map(User::getUsername).toList()); } @Test - public void issueSYNCOPE1922() { - User bellini = userDAO.findByUsername("bellini").orElseThrow(); - - PlainSchema obscureSchema = plainSchemaDAO.findById("obscure").orElseThrow(); - - userDAO.save(addPlainAttr(bellini, obscureSchema, "myobscurevalue")); + void issueSYNCOPE1922() { + anyUtilsFactory.getInstance(AnyTypeKind.USER).addAttr( + validator, + userDAO.findKey("bellini").orElseThrow(), + plainSchemaDAO.findById("obscure").orElseThrow(), + "myobscurevalue"); entityManager.flush(); - AttrCond obscureCond = new AttrCond(AttrCond.Type.EQ); - obscureCond.setSchema("obscure"); - obscureCond.setExpression("myobscurevalue"); - - assertThrows(IllegalArgumentException.class, - () -> searchDAO.search(SearchCond.of(obscureCond), AnyTypeKind.USER)); - } - - private User addPlainAttr(final User user, final PlainSchema plainSchema, final String value) { - user.getPlainAttr(plainSchema.getKey()) - .ifPresentOrElse(ctype -> ctype.getValues().get(0).setStringValue(value), () -> { - PlainAttr attr = new PlainAttr(); - attr.setPlainSchema(plainSchema); - attr.add(validator, value); + AttrCond cond = new AttrCond(AttrCond.Type.EQ); + cond.setSchema("obscure"); + cond.setExpression("myobscurevalue"); - user.add(attr); - }); - return user; + assertThrows(IllegalArgumentException.class, () -> searchDAO.search(SearchCond.of(cond), AnyTypeKind.USER)); } } diff --git a/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/inner/AnySearchTest.java b/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/inner/AnySearchTest.java index 5f8060b022..d83ea87dcf 100644 --- a/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/inner/AnySearchTest.java +++ b/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/inner/AnySearchTest.java @@ -58,6 +58,7 @@ import org.apache.syncope.core.persistence.api.dao.search.ResourceCond; import org.apache.syncope.core.persistence.api.dao.search.RoleCond; import org.apache.syncope.core.persistence.api.dao.search.SearchCond; import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.PlainAttr; import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership; @@ -986,30 +987,75 @@ public class AnySearchTest extends AbstractTest { } @Test - public void issueSYNCOPE1922() { - User bellini = userDAO.findByUsername("bellini").orElseThrow(); + void issueSYNCOPE1906() { + PlainSchema ctypeSchema = plainSchemaDAO.findById("ctype").orElseThrow(); - PlainSchema obscureSchema = plainSchemaDAO.findById("obscure").orElseThrow(); + AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.USER); - userDAO.save(addPlainAttr(bellini, obscureSchema, "myobscurevalue")); + anyUtils.addAttr(validator, userDAO.findKey("bellini").orElseThrow(), ctypeSchema, "aa1"); + assertEquals("aa1", userDAO.findByUsername("bellini").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); - AttrCond obscureCond = new AttrCond(AttrCond.Type.EQ); - obscureCond.setSchema("obscure"); - obscureCond.setExpression("myobscurevalue"); + anyUtils.addAttr(validator, userDAO.findKey("puccini").orElseThrow(), ctypeSchema, "aa2"); + assertEquals("aa2", userDAO.findByUsername("puccini").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); - assertThrows(IllegalArgumentException.class, - () -> searchDAO.search(SearchCond.of(obscureCond), AnyTypeKind.USER)); - } + anyUtils.addAttr(validator, userDAO.findKey("verdi").orElseThrow(), ctypeSchema, "aa3"); + assertEquals("aa3", userDAO.findByUsername("verdi").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); + + anyUtils.removeAttr(userDAO.findKey("vivaldi").orElseThrow(), ctypeSchema); + anyUtils.addAttr(validator, userDAO.findKey("vivaldi").orElseThrow(), ctypeSchema, "aa4"); + assertEquals("aa4", userDAO.findByUsername("vivaldi").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); + + anyUtils.removeAttr(userDAO.findKey("rossini").orElseThrow(), ctypeSchema); + anyUtils.addAttr(validator, userDAO.findKey("rossini").orElseThrow(), ctypeSchema, "aa5"); + assertEquals("aa5", userDAO.findByUsername("rossini").orElseThrow(). + getPlainAttr("ctype").orElseThrow().getValues().getFirst().getValueAsString()); + + AnyCond keyCond = new AnyCond(AttrCond.Type.ISNOTNULL); + keyCond.setSchema("key"); + + List<User> users = searchDAO.search( + SearchCond.of(keyCond), List.of(new Sort.Order(Sort.Direction.DESC, "ctype")), AnyTypeKind.USER); + assertEquals( + List.of("rossini", "vivaldi", "verdi", "puccini", "bellini"), + users.stream().map(User::getUsername).toList()); + + AttrCond surnameCond = new AttrCond(AttrCond.Type.ILIKE); + surnameCond.setSchema("surname"); + surnameCond.setExpression("%ini"); - protected User addPlainAttr(final User user, final PlainSchema plainSchema, final String value) { - user.getPlainAttr(plainSchema.getKey()) - .ifPresentOrElse(ctype -> ctype.getValues().get(0).setStringValue(value), () -> { - PlainAttr attr = new PlainAttr(); - attr.setPlainSchema(plainSchema); - attr.add(validator, value); + AttrCond coolCond = new AttrCond(AttrCond.Type.ISNULL); + coolCond.setSchema("cool"); - user.add(attr); - }); - return user; + // order by ctype even not searching by it + users = searchDAO.search( + SearchCond.and(SearchCond.of(surnameCond), SearchCond.of(coolCond)), + List.of(new Sort.Order(Sort.Direction.DESC, "ctype")), AnyTypeKind.USER); + assertEquals(2, users.size()); + + // order by unique attribute + users = searchDAO.search( + SearchCond.of(keyCond), List.of(new Sort.Order(Sort.Direction.DESC, "fullname")), AnyTypeKind.USER); + assertEquals( + List.of("bellini", "verdi", "rossini", "puccini", "vivaldi"), + users.stream().map(User::getUsername).toList()); + } + + @Test + void issueSYNCOPE1922() { + anyUtilsFactory.getInstance(AnyTypeKind.USER).addAttr( + validator, + userDAO.findKey("bellini").orElseThrow(), + plainSchemaDAO.findById("obscure").orElseThrow(), + "myobscurevalue"); + + AttrCond cond = new AttrCond(AttrCond.Type.EQ); + cond.setSchema("obscure"); + cond.setExpression("myobscurevalue"); + + assertThrows(IllegalArgumentException.class, () -> searchDAO.search(SearchCond.of(cond), AnyTypeKind.USER)); } } diff --git a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormDirectoryPanel.java b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormDirectoryPanel.java index 001493347f..ddce479d77 100644 --- a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormDirectoryPanel.java +++ b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormDirectoryPanel.java @@ -113,6 +113,10 @@ public class UserRequestFormDirectoryPanel components.refreshLatestAlerts(target); } + if (actionTogglePanel.isVisibleInHierarchy()) { + actionTogglePanel.toggle(target, false); + } + manageFormModal.show(false); }); diff --git a/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/panels/OIDCProvidersDirectoryPanel.java b/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/panels/OIDCProvidersDirectoryPanel.java index 4e735fe356..c7d9e92723 100644 --- a/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/panels/OIDCProvidersDirectoryPanel.java +++ b/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/panels/OIDCProvidersDirectoryPanel.java @@ -117,7 +117,7 @@ public class OIDCProvidersDirectoryPanel extends DirectoryPanel< setFooterVisible(false); } }; - templateModal.setWindowClosedCallback(target -> templateModal.show(false)); + setWindowClosedReloadCallback(templateModal); templateModal.size(Modal.Size.Large); addOuterObject(templateModal); diff --git a/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.java b/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.java index fceb950a64..d7f0557a9e 100644 --- a/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.java +++ b/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.java @@ -107,10 +107,7 @@ public class SAML2IdPsDirectoryPanel extends DirectoryPanel< modal.addSubmitButton(); modal.size(Modal.Size.Large); - modal.setWindowClosedCallback(target -> { - updateResultTable(target); - modal.show(false); - }); + setWindowClosedReloadCallback(modal, true); addOuterObject(metadataModal); setWindowClosedReloadCallback(metadataModal); @@ -126,7 +123,7 @@ public class SAML2IdPsDirectoryPanel extends DirectoryPanel< setFooterVisible(false); } }; - templateModal.setWindowClosedCallback(target -> templateModal.show(false)); + setWindowClosedReloadCallback(templateModal); templateModal.size(Modal.Size.Large); addOuterObject(templateModal); diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java index 05d5f43420..20ac76a4b6 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java @@ -83,31 +83,31 @@ public class BatchesITCase extends AbstractConsoleITCase { + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:4:" + "action:action"); - TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:" + "checkgroup:dataTable", WebMarkupContainer.class); component = findComponentByProp("resource", - TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:" + "checkgroup:dataTable", "resource-csv"); assertNotNull(component); FormTester formTester = TESTER.newFormTester( - TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:" + TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:firstLevelContainer:" + "first:container:content:searchContainer:resultTable:tablePanel:groupForm"); assertNotNull(formTester); formTester.select("checkgroup", 0); - TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:batchLink", Constants.ON_CLICK); - TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "secondLevelContainer:second:container", WebMarkupContainer.class); - assertNotNull(findComponentByProp("resource", TAB_PANEL + "outerObjectsRepeater:2:outer:" + assertNotNull(findComponentByProp("resource", TAB_PANEL + "outerObjectsRepeater:0:outer:" + "form:content:status:secondLevelContainer:second:container", "resource-csv")); } @@ -137,12 +137,12 @@ public class BatchesITCase extends AbstractConsoleITCase { + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:3:" + "action:action"); - TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:" + "checkgroup:dataTable", WebMarkupContainer.class); component = findComponentByProp("resource", - TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:first:container:" + TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:firstLevelContainer:first:container:" + "content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", resource); component = TESTER.getComponentFromLastRenderedPage(component.getPageRelativePath() @@ -151,37 +151,37 @@ public class BatchesITCase extends AbstractConsoleITCase { assertEquals(resource, StatusBean.class.cast(component.getDefaultModelObject()).getResource()); FormTester formTester = TESTER.newFormTester( - TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:" + TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:firstLevelContainer:" + "first:container:content:searchContainer:resultTable:tablePanel:groupForm"); assertNotNull(formTester); formTester.select("checkgroup", index); - TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:batchLink", Constants.ON_CLICK); - TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "secondLevelContainer:second:container", WebMarkupContainer.class); // suspend link TESTER.executeAjaxEvent(TAB_PANEL - + "outerObjectsRepeater:2:outer:form:content:status:secondLevelContainer:" + + "outerObjectsRepeater:0:outer:form:content:status:secondLevelContainer:" + "second:container:actions:actionRepeater:0:action:action", Constants.ON_CLICK); assertSuccessMessage(); TESTER.cleanupFeedbackMessages(); - TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "secondLevelContainer:second:container:selectedObjects:body:rows:1:cells:4:cell", "SUCCESS"); TESTER.executeAjaxEvent(TAB_PANEL - + "outerObjectsRepeater:2:outer:form:content:status:secondLevelContainer:back", + + "outerObjectsRepeater:0:outer:form:content:status:secondLevelContainer:back", Constants.ON_CLICK); component = findComponentByProp("resource", - TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:first:container:" + TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:firstLevelContainer:first:container:" + "content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", resource); component = TESTER.getComponentFromLastRenderedPage(component.getPageRelativePath() @@ -204,42 +204,42 @@ public class BatchesITCase extends AbstractConsoleITCase { + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:3:" + "action:action"); - TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:" + "checkgroup:dataTable", WebMarkupContainer.class); formTester = TESTER.newFormTester( - TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:" + TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:firstLevelContainer:" + "first:container:content:searchContainer:resultTable:tablePanel:groupForm"); assertNotNull(formTester); formTester.select("checkgroup", index); - TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:batchLink", Constants.ON_CLICK); - TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "secondLevelContainer:second:container", WebMarkupContainer.class); // suspend link TESTER.executeAjaxEvent(TAB_PANEL - + "outerObjectsRepeater:2:outer:form:content:status:secondLevelContainer:" + + "outerObjectsRepeater:0:outer:form:content:status:secondLevelContainer:" + "second:container:actions:actionRepeater:1:action:action", Constants.ON_CLICK); assertSuccessMessage(); TESTER.cleanupFeedbackMessages(); - TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:" + TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:" + "secondLevelContainer:second:container:selectedObjects:body:rows:1:cells:4:cell", "SUCCESS"); TESTER.executeAjaxEvent(TAB_PANEL - + "outerObjectsRepeater:2:outer:form:content:status:secondLevelContainer:back", + + "outerObjectsRepeater:0:outer:form:content:status:secondLevelContainer:back", Constants.ON_CLICK); component = findComponentByProp("resource", - TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:first:container:" + TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:status:firstLevelContainer:first:container:" + "content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", resource); component = TESTER.getComponentFromLastRenderedPage(component.getPageRelativePath() diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/LinkedAccountsITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/LinkedAccountsITCase.java index becfc268c6..8a0fc795fa 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/LinkedAccountsITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/LinkedAccountsITCase.java @@ -124,12 +124,14 @@ public class LinkedAccountsITCase extends AbstractConsoleITCase { TESTER.clickLink(TAB_PANEL + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:" + "actions:actions:actionRepeater:6:action:action"); // Search for user - TESTER.executeAjaxEvent(USER_SEARCH_FORM + "content:panelPlus:add", Constants.ON_CLICK); - FormTester formTester = TESTER.newFormTester(USER_SEARCH_FORM); + TESTER.executeAjaxEvent(USER_SEARCH_FORM.replace(":2:", ":0:") + "content:panelPlus:add", Constants.ON_CLICK); + FormTester formTester = TESTER.newFormTester(USER_SEARCH_FORM.replace(":2:", ":0:")); - DropDownChoice<?> type = (DropDownChoice<?>) TESTER.getComponentFromLastRenderedPage(USER_SEARCH_FORM + DropDownChoice<?> type = (DropDownChoice<?>) TESTER.getComponentFromLastRenderedPage( + USER_SEARCH_FORM.replace(":2:", ":0:") + "content:view:0:panel:container:type:dropDownChoiceField"); - TESTER.executeAjaxEvent(USER_SEARCH_FORM + "content:view:0:panel:container:type:dropDownChoiceField", + TESTER.executeAjaxEvent(USER_SEARCH_FORM.replace(":2:", ":0:") + + "content:view:0:panel:container:type:dropDownChoiceField", Constants.ON_CHANGE); type.setModelValue(new String[] { "ATTRIBUTE" }); type.setDefaultModelObject(SearchClause.Type.ATTRIBUTE); @@ -149,32 +151,33 @@ public class LinkedAccountsITCase extends AbstractConsoleITCase { TESTER.assertNoErrorMessage(); // Locate result in data table - Component comp = findComponentByProp("username", TAB_PANEL + SEARCH_PANEL + RESULT_DATA_TABLE, USER. - getUsername()); + Component comp = findComponentByProp("username", TAB_PANEL + SEARCH_PANEL.replace(":2:", ":0:") + + RESULT_DATA_TABLE, USER.getUsername()); TESTER.executeAjaxEvent(comp.getPageRelativePath(), Constants.ON_CLICK); // Select user - TESTER.clickLink(TAB_PANEL + SEARCH_PANEL + SELECT_USER_ACTION); + TESTER.clickLink(TAB_PANEL + SEARCH_PANEL.replace(":2:", ":0:") + SELECT_USER_ACTION); // move onto the next panel - TESTER.getComponentFromLastRenderedPage(TAB_PANEL + FORM + "view").setEnabled(false); - formTester = TESTER.newFormTester(TAB_PANEL + FORM); + TESTER.getComponentFromLastRenderedPage(TAB_PANEL + FORM.replace(":2:", ":0:") + "view").setEnabled(false); + formTester = TESTER.newFormTester(TAB_PANEL + FORM.replace(":2:", ":0:")); formTester.submit("buttons:next"); // Select a resource - comp = findComponentByProp("key", TAB_PANEL + FORM + RESOURCES_DATA_TABLE + "body:rows", "resource-ldap"); + comp = findComponentByProp("key", TAB_PANEL + FORM.replace(":2:", ":0:") + RESOURCES_DATA_TABLE + "body:rows", + "resource-ldap"); assertNotNull(comp); TESTER.executeAjaxEvent(comp.getPageRelativePath(), Constants.ON_CLICK); - TESTER.clickLink(TAB_PANEL + FORM + SELECT_RESOURCE_ACTION); + TESTER.clickLink(TAB_PANEL + FORM.replace(":2:", ":0:") + SELECT_RESOURCE_ACTION); // move onto the next panel - TESTER.getComponentFromLastRenderedPage(TAB_PANEL + FORM + "view").setEnabled(false); - formTester = TESTER.newFormTester(TAB_PANEL + FORM); + TESTER.getComponentFromLastRenderedPage(TAB_PANEL + FORM.replace(":2:", ":0:") + "view").setEnabled(false); + formTester = TESTER.newFormTester(TAB_PANEL + FORM.replace(":2:", ":0:")); formTester.submit("buttons:next"); // Finish merge - TESTER.getComponentFromLastRenderedPage(TAB_PANEL + FORM + "view").setEnabled(false); - formTester = TESTER.newFormTester(TAB_PANEL + FORM); + TESTER.getComponentFromLastRenderedPage(TAB_PANEL + FORM.replace(":2:", ":0:") + "view").setEnabled(false); + formTester = TESTER.newFormTester(TAB_PANEL + FORM.replace(":2:", ":0:")); formTester.submit("buttons:finish"); UserService userService = SyncopeConsoleSession.get().getService(UserService.class); diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java index 7b4a0891bd..ac40b32bbd 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java @@ -1165,7 +1165,7 @@ public class SearchITCase extends AbstractITCase { } @Test - public void issueSYNCOPE1922() { + void issueSYNCOPE1922() { // 1. set encrypted value updateUser(new UserUR.Builder(USER_SERVICE.read("bellini").getKey()).plainAttr( attrAddReplacePatch("obscure", "myobscurevalue")).build());
