This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch 3_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/3_0_X by this push:
new a8c011f143 [SYNCOPE-1908] Streamline Resources and Relationships
management (#1169)
a8c011f143 is described below
commit a8c011f1431bd1cbdaa47a284bb94b89c43fa6ab
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Thu Sep 4 12:24:42 2025 +0200
[SYNCOPE-1908] Streamline Resources and Relationships management (#1169)
---
.../commons/IdMExternalResourceProvider.java | 18 +++-
.../client/console/wizards/any/Resources.java | 6 +-
.../ui/commons/layout/AbstractAnyFormLayout.java | 1 -
.../ui/commons/wizards/any/AbstractResources.java | 29 +++---
.../console/commons/ExternalResourceProvider.java | 5 +-
.../commons/IdRepoExternalResourceProvider.java | 7 +-
.../console/layout/AnyObjectFormLayoutInfo.java | 1 -
.../client/console/layout/GroupFormLayoutInfo.java | 1 -
.../client/console/panels/AccountPolicy.java | 1 -
.../client/console/panels/RealmDetails.java | 2 +-
.../console/panels/RelationshipViewPanel.java | 32 +++----
.../console/panels/search/AbstractSearchPanel.java | 16 ++--
.../panels/search/AnyObjectSearchPanel.java | 8 +-
.../console/panels/search/GroupSearchPanel.java | 2 +-
.../console/policies/PolicyModalPanelBuilder.java | 2 +-
.../console/wizards/any/AnyWizardBuilder.java | 3 +-
.../client/console/wizards/any/Relationships.java | 106 ++++++---------------
.../wizards/any/Relationships$Specification.html | 2 +-
.../apache/syncope/common/lib/AnyOperations.java | 4 +-
.../apache/syncope/fit/console/UsersITCase.java | 101 --------------------
pom.xml | 2 +-
21 files changed, 104 insertions(+), 245 deletions(-)
diff --git
a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMExternalResourceProvider.java
b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMExternalResourceProvider.java
index bb92a28554..236dbeee1f 100644
---
a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMExternalResourceProvider.java
+++
b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMExternalResourceProvider.java
@@ -22,6 +22,7 @@ import java.util.List;
import java.util.stream.Collectors;
import org.apache.syncope.client.console.rest.ResourceRestClient;
import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
public class IdMExternalResourceProvider implements ExternalResourceProvider {
@@ -34,7 +35,20 @@ public class IdMExternalResourceProvider implements
ExternalResourceProvider {
}
@Override
- public List<String> get() {
- return
resourceRestClient.list().stream().map(ResourceTO::getKey).collect(Collectors.toList());
+ public List<String> get(final String anyType) {
+ return resourceRestClient.list().stream().
+ filter(r -> anyType == null
+ || AnyTypeKind.GROUP.name().equals(anyType)
+ || r.getProvision(anyType).isPresent()).
+ map(ResourceTO::getKey).
+ collect(Collectors.toList());
+ }
+
+ @Override
+ public List<String> getForRealms() {
+ return resourceRestClient.list().stream().
+ filter(r -> r.getOrgUnit() != null).
+ map(ResourceTO::getKey).
+ collect(Collectors.toList());
}
}
diff --git
a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
index ac1d1e131c..db2aeec635 100644
---
a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
+++
b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
@@ -47,10 +47,10 @@ public class Resources extends AbstractResources {
public boolean evaluate() {
if (SyncopeWebApplication.get().getSecuritySettings().
getAuthorizationStrategy().isActionAuthorized(this, RENDER)) {
-
available.setObject(SyncopeWebApplication.get().getResourceProvider().get());
+
+
available.setObject(SyncopeWebApplication.get().getResourceProvider().get(anyTO.getType()));
return !available.getObject().isEmpty();
- } else {
- return false;
}
+ return false;
}
}
diff --git
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/layout/AbstractAnyFormLayout.java
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/layout/AbstractAnyFormLayout.java
index 87462253ae..3e2ba89820 100644
---
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/layout/AbstractAnyFormLayout.java
+++
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/layout/AbstractAnyFormLayout.java
@@ -45,5 +45,4 @@ public abstract class AbstractAnyFormLayout<A extends AnyTO,
F extends AnyForm<A
public List<String> getWhichVirAttrs() {
return whichVirAttrs;
}
-
}
diff --git
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AbstractResources.java
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AbstractResources.java
index 47c265f335..0d141dd2ee 100644
---
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AbstractResources.java
+++
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AbstractResources.java
@@ -34,10 +34,12 @@ public abstract class AbstractResources extends WizardStep
implements ICondition
private static final long serialVersionUID = 552437609667518888L;
+ protected final AnyTO anyTO;
+
protected final ListModel<String> available;
public <T extends AnyTO> AbstractResources(final AnyWrapper<T>
modelObject) {
- final T entityTO = modelObject.getInnerObject();
+ anyTO = modelObject.getInnerObject();
if (modelObject instanceof UserWrapper
&& UserWrapper.class.cast(modelObject).getPreviousUserTO() !=
null
@@ -52,21 +54,20 @@ public abstract class AbstractResources extends WizardStep
implements ICondition
this.setOutputMarkupId(true);
this.available = new ListModel<>(List.of());
- add(new AjaxPalettePanel.Builder<String>().build("resources",
- new PropertyModel<>(entityTO, "resources") {
+ add(new AjaxPalettePanel.Builder<String>().build("resources", new
PropertyModel<>(anyTO, "resources") {
- private static final long serialVersionUID =
3799387950428254072L;
+ private static final long serialVersionUID = 3799387950428254072L;
- @Override
- public List<String> getObject() {
- return new ArrayList<>(entityTO.getResources());
- }
+ @Override
+ public List<String> getObject() {
+ return new ArrayList<>(anyTO.getResources());
+ }
- @Override
- public void setObject(final List<String> object) {
- entityTO.getResources().clear();
- entityTO.getResources().addAll(object);
- }
- }, available).hideLabel().setOutputMarkupId(true));
+ @Override
+ public void setObject(final List<String> object) {
+ anyTO.getResources().clear();
+ anyTO.getResources().addAll(object);
+ }
+ }, available).hideLabel().setOutputMarkupId(true));
}
}
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/ExternalResourceProvider.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/ExternalResourceProvider.java
index fc419cff9f..0b86069239 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/ExternalResourceProvider.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/ExternalResourceProvider.java
@@ -21,8 +21,9 @@ package org.apache.syncope.client.console.commons;
import java.io.Serializable;
import java.util.List;
-@FunctionalInterface
public interface ExternalResourceProvider extends Serializable {
- List<String> get();
+ List<String> get(String anyType);
+
+ List<String> getForRealms();
}
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoExternalResourceProvider.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoExternalResourceProvider.java
index e21f6225bc..5c0a5e776a 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoExternalResourceProvider.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/IdRepoExternalResourceProvider.java
@@ -25,7 +25,12 @@ public class IdRepoExternalResourceProvider implements
ExternalResourceProvider
private static final long serialVersionUID = 3002474783308961295L;
@Override
- public List<String> get() {
+ public List<String> get(final String anyType) {
+ return List.of();
+ }
+
+ @Override
+ public List<String> getForRealms() {
return List.of();
}
}
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
index 2012e63194..e1fe0fbd78 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/layout/AnyObjectFormLayoutInfo.java
@@ -40,5 +40,4 @@ public class AnyObjectFormLayoutInfo extends
AbstractAnyFormLayout<AnyObjectTO,
public void setRelationships(final boolean relationships) {
this.relationships = relationships;
}
-
}
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/layout/GroupFormLayoutInfo.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/layout/GroupFormLayoutInfo.java
index 722b6b4bcb..739f65ed19 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/layout/GroupFormLayoutInfo.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/layout/GroupFormLayoutInfo.java
@@ -60,5 +60,4 @@ public class GroupFormLayoutInfo extends
AbstractAnyFormLayout<GroupTO, GroupFor
public void setTypeExtensions(final boolean typeExtensions) {
this.typeExtensions = typeExtensions;
}
-
}
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AccountPolicy.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AccountPolicy.java
index 60aae41a80..db1d36c9aa 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AccountPolicy.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AccountPolicy.java
@@ -31,5 +31,4 @@ public class AccountPolicy extends Panel {
public AccountPolicy(final String id) {
super(id);
}
-
}
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 c02ef37cf7..eabb6829f2 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
@@ -67,7 +67,7 @@ public class RealmDetails extends Panel {
@Override
protected List<String> load() {
- return SyncopeWebApplication.get().getResourceProvider().get();
+ return
SyncopeWebApplication.get().getResourceProvider().getForRealms();
}
};
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipViewPanel.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipViewPanel.java
index d979d2f96d..b19aabdcb7 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipViewPanel.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipViewPanel.java
@@ -56,8 +56,15 @@ public final class RelationshipViewPanel extends
WizardMgtPanel<RelationshipTO>
final AnyTO anyTO,
final boolean reuseItem,
final boolean wizardInModal) {
+
super(id, wizardInModal);
- addInnerObject(getHeader());
+
+ WebMarkupContainer header = new WebMarkupContainer("header");
+ header.add(new Label("header_left_end", getString("left.end")));
+ header.add(new Label("header_relationship", new
ResourceModel("relationship")));
+ header.add(new Label("header_right_end", new
ResourceModel("right.end")));
+ addInnerObject(header);
+
relationshipsList = new ListView<>("relationships", relationships) {
private static final long serialVersionUID = 4983556433071042668L;
@@ -101,9 +108,8 @@ public final class RelationshipViewPanel extends
WizardMgtPanel<RelationshipTO>
if (togglePanel == null) {
relationshipItem.add(action);
} else {
- relationshipItem.add(new ActionsPanel<>("action", new
Model<>(relationshipTO))
- .setVisible(false)
- .setEnabled(false));
+ relationshipItem.add(new ActionsPanel<>("action", new
Model<>(relationshipTO)).
+ setVisible(false).setEnabled(false));
}
}
};
@@ -112,21 +118,13 @@ public final class RelationshipViewPanel extends
WizardMgtPanel<RelationshipTO>
relationshipsList.setRenderBodyOnly(true);
addInnerObject(relationshipsList);
-
- }
-
- private WebMarkupContainer getHeader() {
- WebMarkupContainer headerContainer = new WebMarkupContainer("header");
- headerContainer.add(new Label("header_left_end",
getString("left.end")));
- headerContainer.add(new Label("header_relationship", new
ResourceModel("relationship")));
- headerContainer.add(new Label("header_right_end", new
ResourceModel("right.end")));
- return headerContainer;
}
- private void buildRowLabels(
+ private static void buildRowLabels(
final ListItem<RelationshipTO> row,
final RelationshipTO relationshipTO,
final AnyTO anyTO) {
+
boolean isLeftRelation = relationshipTO.getEnd() ==
RelationshipTO.End.LEFT;
String anyName = anyTO instanceof UserTO
? UserTO.class.cast(anyTO).getUsername()
@@ -149,7 +147,7 @@ public final class RelationshipViewPanel extends
WizardMgtPanel<RelationshipTO>
row.add(leftEnd, rightEnd);
}
- private void setBold(final Label... labels) {
+ private static void setBold(final Label... labels) {
for (Label label : labels) {
label.add(new AttributeModifier("style", "font-weight: bold;"));
}
@@ -176,7 +174,6 @@ public final class RelationshipViewPanel extends
WizardMgtPanel<RelationshipTO>
return this;
}
-
public RelationshipViewPanel.Builder setRelationships(final
List<RelationshipTO> relationships) {
this.relationships = relationships;
return this;
@@ -204,8 +201,5 @@ public final class RelationshipViewPanel extends
WizardMgtPanel<RelationshipTO>
protected WizardMgtPanel<RelationshipTO> newInstance(final String id,
final boolean wizardInModal) {
return new RelationshipViewPanel(id, relationships, anyTO,
reuseItem, wizardInModal);
}
-
}
-
}
-
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
index ace22a7ae0..20c8afcebe 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
@@ -89,7 +89,7 @@ public abstract class AbstractSearchPanel extends Panel {
protected final AnyTypeKind typeKind;
- protected final String type;
+ protected final String anyType;
public abstract static class Builder<T extends AbstractSearchPanel>
implements Serializable {
@@ -152,7 +152,7 @@ public abstract class AbstractSearchPanel extends Panel {
this.model = builder.model;
this.typeKind = kind;
- this.type = type;
+ this.anyType = type;
setOutputMarkupId(true);
@@ -235,8 +235,8 @@ public abstract class AbstractSearchPanel extends Panel {
protected abstract String getFIQLQueryTarget();
protected void updateFIQL(final AjaxRequestTarget target, final String
fiql) {
- model.setObject(SearchUtils.getSearchClauses(
-
fiql.replaceAll(SearchUtils.getTypeConditionPattern(type).pattern(), "")));
+
model.setObject(SearchUtils.getSearchClauses(fiql.replaceAll(SearchUtils.getTypeConditionPattern(anyType).
+ pattern(), "")));
target.add(searchFormContainer);
}
@@ -276,17 +276,17 @@ public abstract class AbstractSearchPanel extends Panel {
@Override
protected List<String> load() {
- return SyncopeWebApplication.get().getResourceProvider().get();
+ return
SyncopeWebApplication.get().getResourceProvider().get(anyType);
}
};
}
public IModel<List<SearchClause>> getModel() {
- return this.model;
+ return model;
}
- public String getBackObjectType() {
- return this.type;
+ public String getAnyType() {
+ return anyType;
}
public Map<String, PlainSchemaTO> getAvailableSchemaTypes() {
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSearchPanel.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSearchPanel.java
index 908168830c..4045b8f03a 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSearchPanel.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/AnyObjectSearchPanel.java
@@ -77,12 +77,12 @@ public class AnyObjectSearchPanel extends
AbstractSearchPanel {
@Override
protected AbstractFiqlSearchConditionBuilder<?, ?, ?>
getSearchConditionBuilder() {
- return SyncopeClient.getAnyObjectSearchConditionBuilder(type);
+ return SyncopeClient.getAnyObjectSearchConditionBuilder(anyType);
}
@Override
protected String getFIQLQueryTarget() {
- return type;
+ return anyType;
}
@Override
@@ -121,8 +121,8 @@ public class AnyObjectSearchPanel extends
AbstractSearchPanel {
@Override
protected Map<String, PlainSchemaTO> load() {
- return
schemaRestClient.<PlainSchemaTO>getSchemas(SchemaType.PLAIN, null,
anyTypeRestClient.read(type).
- getClasses().toArray(String[]::new)).
+ return schemaRestClient.<PlainSchemaTO>getSchemas(
+ SchemaType.PLAIN, null,
anyTypeRestClient.read(anyType).getClasses().toArray(String[]::new)).
stream().collect(Collectors.toMap(SchemaTO::getKey,
Function.identity()));
}
};
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSearchPanel.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSearchPanel.java
index 66251893dd..22da0fad1a 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSearchPanel.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/GroupSearchPanel.java
@@ -110,7 +110,7 @@ public class GroupSearchPanel extends AbstractSearchPanel {
@Override
protected Map<String, PlainSchemaTO> load() {
return schemaRestClient.<PlainSchemaTO>getSchemas(
- SchemaType.PLAIN, null,
anyTypeRestClient.read(type).getClasses().toArray(String[]::new)).
+ SchemaType.PLAIN, null,
anyTypeRestClient.read(anyType).getClasses().toArray(String[]::new)).
stream().collect(Collectors.toMap(SchemaTO::getKey,
Function.identity()));
}
};
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
index 164306d2ab..112389d0b4 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
@@ -134,7 +134,7 @@ public class PolicyModalPanelBuilder<T extends PolicyTO>
extends AbstractModalPa
@Override
protected List<String> load() {
- return SyncopeWebApplication.get().getResourceProvider().get();
+ return
SyncopeWebApplication.get().getResourceProvider().get(null);
}
};
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
index b02247bc98..22ce991e1d 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
@@ -127,8 +127,7 @@ public abstract class AnyWizardBuilder<A extends AnyTO>
extends AbstractAnyWizar
// attributes panel steps
if (formLayoutInfo.isPlainAttrs()) {
- wizardModel.add(
- new PlainAttrs(modelObject, mode, anyTypeClasses,
formLayoutInfo.getWhichPlainAttrs()) {
+ wizardModel.add(new PlainAttrs(modelObject, mode, anyTypeClasses,
formLayoutInfo.getWhichPlainAttrs()) {
private static final long serialVersionUID =
8167894751609598306L;
diff --git
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
index a04054e42f..348569a184 100644
---
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
+++
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.wizards.any;
import java.util.ArrayList;
import java.util.List;
-import java.util.Optional;
import java.util.stream.Collectors;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.StringUtils;
@@ -32,7 +31,6 @@ import
org.apache.syncope.client.console.panels.search.AnySelectionDirectoryPane
import org.apache.syncope.client.console.panels.search.SearchClausePanel;
import org.apache.syncope.client.console.panels.search.SearchUtils;
import org.apache.syncope.client.console.rest.AnyObjectRestClient;
-import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
import org.apache.syncope.client.console.rest.AnyTypeRestClient;
import org.apache.syncope.client.console.rest.RelationshipTypeRestClient;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
@@ -63,10 +61,8 @@ import
org.apache.wicket.extensions.wizard.WizardModel.ICondition;
import org.apache.wicket.extensions.wizard.WizardStep;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.IChoiceRenderer;
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.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
@@ -81,13 +77,10 @@ public class Relationships extends WizardStep implements
ICondition {
protected RelationshipTypeRestClient relationshipTypeRestClient;
@SpringBean
- protected AnyTypeRestClient anyTypeRestClient;
-
- @SpringBean
- protected AnyTypeClassRestClient anyTypeClassRestClient;
+ protected AnyObjectRestClient anyObjectRestClient;
@SpringBean
- protected AnyObjectRestClient anyObjectRestClient;
+ protected AnyTypeRestClient anyTypeRestClient;
protected final AnyTO anyTO;
@@ -163,13 +156,14 @@ public class Relationships extends WizardStep implements
ICondition {
: List.of();
}
- protected void addNewRelationships(final RelationshipTO... rels) {
- getCurrentRelationships().addAll(List.of(rels));
+ protected void addNewRelationship(final RelationshipTO relaltionship) {
+ if (anyTO instanceof GroupableRelatableTO) {
+
GroupableRelatableTO.class.cast(anyTO).getRelationships().add(relaltionship);
+ }
}
@Override
public boolean evaluate() {
- // [SYNCOPE-1171] - skip current step when the are no relationships
types in Syncope
return !relationshipTypeRestClient.list().isEmpty();
}
@@ -179,10 +173,6 @@ public class Relationships extends WizardStep implements
ICondition {
protected final RelationshipTO rel;
- protected final AjaxDropDownChoicePanel<String> type;
-
- protected final AjaxDropDownChoicePanel<AnyTypeTO> otherType;
-
protected final WebMarkupContainer container;
protected final Fragment emptyFragment;
@@ -200,58 +190,18 @@ public class Relationships extends WizardStep implements
ICondition {
List<String> availableRels =
relationshipTypeRestClient.list().stream().
map(RelationshipTypeTO::getKey).collect(Collectors.toList());
-
- type = new AjaxDropDownChoicePanel<>("type", "type", new
PropertyModel<>(rel, "type"));
+ AjaxDropDownChoicePanel<String> type = new
AjaxDropDownChoicePanel<>(
+ "type", "type", new PropertyModel<>(rel, "type"));
type.setChoices(availableRels);
add(type.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setRenderBodyOnly(true));
- List<AnyTypeTO> availableTypes =
anyTypeRestClient.listAnyTypes().stream().
- filter(anyType -> anyType.getKind() != AnyTypeKind.GROUP
- && anyType.getKind() !=
AnyTypeKind.USER).collect(Collectors.toList());
-
- otherType = new AjaxDropDownChoicePanel<>("otherType",
"otherType", new PropertyModel<>(rel, "otherType") {
-
- private static final long serialVersionUID =
-5861057041758169508L;
-
- @Override
- public AnyTypeTO getObject() {
- for (AnyTypeTO obj : availableTypes) {
- if (obj.getKey().equals(rel.getOtherEndType())) {
- return obj;
- }
- }
- return null;
- }
-
- @Override
- public void setObject(final AnyTypeTO object) {
-
rel.setOtherEndType(Optional.ofNullable(object).map(AnyTypeTO::getKey).orElse(null));
- }
- }, false);
- otherType.setChoices(availableTypes);
- otherType.setChoiceRenderer(new IChoiceRenderer<>() {
-
- private static final long serialVersionUID =
-734743540442190178L;
-
- @Override
- public Object getDisplayValue(final AnyTypeTO object) {
- return object.getKey();
- }
-
- @Override
- public String getIdValue(final AnyTypeTO object, final int
index) {
- return object.getKey();
- }
-
- @Override
- public AnyTypeTO getObject(final String id, final IModel<?
extends List<? extends AnyTypeTO>> choices) {
- return choices.getObject().stream().
- filter(anyTypeTO ->
id.equals(anyTypeTO.getKey())).findAny().orElse(null);
- }
- });
- // enable "otherType" dropdown only if "type" option is selected -
SYNCOPE-1140
- otherType.setEnabled(false);
-
add(otherType.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
+ List<String> availableTypes =
anyTypeRestClient.listAnyTypes().stream().
+ filter(anyType -> anyType.getKind() ==
AnyTypeKind.ANY_OBJECT).
+ map(AnyTypeTO::getKey).collect(Collectors.toList());
+ AjaxDropDownChoicePanel<String> otherEndType = new
AjaxDropDownChoicePanel<>(
+ "otherType", "otherType", new PropertyModel<>(rel,
"otherEndType"), false);
+ otherEndType.setChoices(availableTypes);
+
add(otherEndType.setEnabled(false).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
container = new WebMarkupContainer("searchPanelContainer");
add(container.setOutputMarkupId(true));
@@ -268,21 +218,21 @@ public class Relationships extends WizardStep implements
ICondition {
@Override
protected void onUpdate(final AjaxRequestTarget target) {
container.addOrReplace(emptyFragment.setRenderBodyOnly(true));
- otherType.setModelObject(null);
+ otherEndType.setModelObject(null);
// enable "otherType" dropdown only if "type" option is
selected - SYNCOPE-1140
- otherType.setEnabled(type.getModelObject() != null &&
!type.getModelObject().isEmpty());
- target.add(otherType);
+ otherEndType.setEnabled(type.getModelObject() != null &&
!type.getModelObject().isEmpty());
+ target.add(otherEndType);
target.add(container);
}
});
- otherType.getField().add(new
IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+ otherEndType.getField().add(new
IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
private static final long serialVersionUID =
-1107858522700306810L;
@Override
protected void onUpdate(final AjaxRequestTarget target) {
- AnyTypeTO anyType = otherType.getModelObject();
+ String anyType = otherEndType.getModelObject();
if (anyType == null) {
container.addOrReplace(emptyFragment.setRenderBodyOnly(true));
} else {
@@ -294,9 +244,9 @@ public class Relationships extends WizardStep implements
ICondition {
});
}
- protected void setupFragment(final AnyTypeTO anyType) {
+ protected void setupFragment(final String anyType) {
anyObjectSearchPanel = new AnyObjectSearchPanel.Builder(
- anyType.getKey(),
+ anyType,
new ListModel<>(new ArrayList<>()),
pageRef).
enableSearch(Specification.this).
@@ -304,11 +254,11 @@ public class Relationships extends WizardStep implements
ICondition {
fragment.addOrReplace(anyObjectSearchPanel.setRenderBodyOnly(true));
anyObjectDirectoryPanel = new
AnyObjectSelectionDirectoryPanel.Builder(
- anyTypeClassRestClient.list(anyType.getClasses()),
+ List.of(),
anyObjectRestClient,
- anyType.getKey(),
+ anyType,
pageRef).
-
setFiql(SyncopeClient.getAnyObjectSearchConditionBuilder(anyType.getKey()).
+
setFiql(SyncopeClient.getAnyObjectSearchConditionBuilder(anyType).
is(Constants.KEY_FIELD_NAME).notNullValue().query()).
setWizardInModal(true).build("searchResultPanel");
fragment.addOrReplace(anyObjectDirectoryPanel.setRenderBodyOnly(true));
@@ -320,8 +270,8 @@ public class Relationships extends WizardStep implements
ICondition {
AjaxRequestTarget target =
SearchClausePanel.SearchEvent.class.cast(event.getPayload()).getTarget();
String fiql =
SearchUtils.buildFIQL(anyObjectSearchPanel.getModel().getObject(),
-
SyncopeClient.getAnyObjectSearchConditionBuilder(anyObjectSearchPanel.getBackObjectType()));
-
AnyDirectoryPanel.class.cast(Specification.this.anyObjectDirectoryPanel).search(fiql,
target);
+
SyncopeClient.getAnyObjectSearchConditionBuilder(anyObjectSearchPanel.getAnyType()));
+
AnyDirectoryPanel.class.cast(anyObjectDirectoryPanel).search(fiql, target);
} else if (event.getPayload() instanceof
AnySelectionDirectoryPanel.ItemSelection) {
AjaxRequestTarget target =
AnySelectionDirectoryPanel.ItemSelection.class.cast(event.getPayload()).getTarget();
@@ -330,7 +280,7 @@ public class Relationships extends WizardStep implements
ICondition {
rel.setOtherEndKey(right.getKey());
rel.setOtherEndName(AnyObjectTO.class.cast(right).getName());
- Relationships.this.addNewRelationships(rel);
+ Relationships.this.addNewRelationship(rel);
Relationships.this.addOrReplace(getViewFragment().setRenderBodyOnly(true));
target.add(Relationships.this);
diff --git
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Relationships$Specification.html
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Relationships$Specification.html
index c58eb6f595..18e2b52189 100644
---
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Relationships$Specification.html
+++
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Relationships$Specification.html
@@ -19,7 +19,7 @@ under the License.
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
<div class="form-group">
- <span wicket:id="type" />
+ <span wicket:id="type"/>
</div>
<div class="form-group">
diff --git
a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
index 5baff5a480..42e9116374 100644
---
a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
+++
b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
@@ -179,7 +179,7 @@ public final class AnyOperations {
EntityTOUtils.buildRelationshipMap(original.getRelationships());
updatedRels.entrySet().stream().
- filter(entry -> (!originalRels.containsKey(entry.getKey()))).
+ filter(entry -> !originalRels.containsKey(entry.getKey())).
forEach(entry -> result.getRelationships().add(new
RelationshipUR.Builder(entry.getValue()).
operation(PatchOperation.ADD_REPLACE).build()));
@@ -285,7 +285,7 @@ public final class AnyOperations {
EntityTOUtils.buildRelationshipMap(original.getRelationships());
updatedRels.entrySet().stream().
- filter(entry -> (!originalRels.containsKey(entry.getKey()))).
+ filter(entry -> !originalRels.containsKey(entry.getKey())).
forEach(entry -> result.getRelationships().add(new
RelationshipUR.Builder(entry.getValue()).
operation(PatchOperation.ADD_REPLACE).build()));
diff --git
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java
index 1a02eda814..0a30dc5183 100644
---
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java
+++
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java
@@ -107,107 +107,6 @@ public class UsersITCase extends AbstractConsoleITCase {
formTester.submit("buttons:cancel");
}
- @Test
- public void editRelationships() {
- TESTER.clickLink("body:realmsLI:realms", false);
-
TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
-
- Component component = findComponentByProp("username", CONTAINER
- +
":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable",
"puccini");
- assertNotNull(component);
-
- TESTER.executeAjaxEvent(component.getPageRelativePath(),
Constants.ON_CLICK);
- TESTER.clickLink(TAB_PANEL
- +
"outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
- + "actions:actions:actionRepeater:0:action:action");
-
- TESTER.assertComponent(TAB_PANEL
- +
"outerObjectsRepeater:0:outer:form:content:form:view:username:textField",
- TextField.class);
-
- FormTester formTester = TESTER.newFormTester(TAB_PANEL
- + "outerObjectsRepeater:0:outer:form:content:form");
- assertNotNull(formTester);
-
- formTester.submit("buttons:next");
-
- formTester = TESTER.newFormTester(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form");
- assertNotNull(formTester);
- formTester.submit("buttons:next");
-
- formTester = TESTER.newFormTester(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form");
- assertNotNull(formTester);
- formTester.submit("buttons:next");
-
- formTester = TESTER.newFormTester(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form");
- assertNotNull(formTester);
- formTester.submit("buttons:next");
-
- formTester = TESTER.newFormTester(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form");
- assertNotNull(formTester);
- formTester.submit("buttons:next");
-
- formTester = TESTER.newFormTester(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form");
- assertNotNull(formTester);
- formTester.submit("buttons:next");
-
- formTester = TESTER.newFormTester(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form");
- assertNotNull(formTester);
- formTester.submit("buttons:next");
-
- // Add first RELATIONSHIP
- addRelationship("Canon MF 8030cn");
- component = TESTER.getComponentFromLastRenderedPage(TAB_PANEL +
"outerObjectsRepeater:0:outer"
- +
":form:content:form:view:relationships:relationships:container:content:relationships:0:right_end");
- assertNotNull(component);
- assertEquals("PRINTER Canon MF 8030cn",
component.getDefaultModel().getObject());
-
- // Add second RELATIONSHIP
- addRelationship("HP LJ 1300n");
- component = TESTER.getComponentFromLastRenderedPage(TAB_PANEL +
"outerObjectsRepeater:0:outer"
- +
":form:content:form:view:relationships:relationships:container:content:relationships:1:right_end");
- assertNotNull(component);
- assertEquals("PRINTER HP LJ 1300n",
component.getDefaultModel().getObject());
-
- formTester = TESTER.newFormTester(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form");
- assertNotNull(formTester);
- formTester.submit("buttons:cancel");
- }
-
- // issue SYNCOPE-1846
- private void addRelationship(final String printerName) {
- TESTER.executeAjaxEvent(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form:view:relationships:actions:"
- + "actionRepeater:0:action:action", Constants.ON_CLICK);
- FormTester formTester = TESTER.newFormTester(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form");
- assertNotNull(formTester);
-
-
formTester.setValue("view:relationships:specification:type:dropDownChoiceField",
"neighborhood");
- TESTER.executeAjaxEvent(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form:view:relationships:"
- + "specification:type:dropDownChoiceField",
Constants.ON_CHANGE);
-
formTester.setValue("view:relationships:specification:type:dropDownChoiceField",
"neighborhood");
- // The ON_CHANGE above should enable this component, but it doesn't;
doing it by hand
- Component otherType = findComponentById(
- TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form:view:relationships:specification",
- "otherType");
- assertNotNull(otherType);
- otherType.setEnabled(true);
-
-
formTester.setValue("view:relationships:specification:otherType:dropDownChoiceField",
"PRINTER");
- TESTER.executeAjaxEvent(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form:view:relationships:"
- + "specification:otherType:dropDownChoiceField",
Constants.ON_CHANGE);
-
- Component component = findComponentByProp("name", TAB_PANEL +
"outerObjectsRepeater:"
- +
"0:outer:form:content:form:view:relationships:specification:searchPanelContainer:searchPanel:"
- +
"searchResultPanel:container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:"
- + "dataTable:body:rows:1:cells:2:cell", printerName);
- assertNotNull(component);
- TESTER.executeAjaxEvent(component, Constants.ON_CLICK);
- TESTER.clickLink(TAB_PANEL +
"outerObjectsRepeater:0:outer:form:content:form:view:relationships:specification:"
- + "searchPanelContainer:searchPanel:searchResultPanel:"
- +
"outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
- + "actions:actions:actionRepeater:0:action:action");
- }
-
@Test
public void editUser() {
TESTER.clickLink("body:realmsLI:realms", false);
diff --git a/pom.xml b/pom.xml
index 1934b15234..1f4ea818ba 100644
--- a/pom.xml
+++ b/pom.xml
@@ -450,7 +450,7 @@ under the License.
<h2.version>2.3.232</h2.version>
<swagger-core.version>2.2.36</swagger-core.version>
- <swagger-ui.version>5.27.1</swagger-ui.version>
+ <swagger-ui.version>5.28.0</swagger-ui.version>
<jquery-slimscroll.version>1.3.8</jquery-slimscroll.version>
<jquery-cookie.version>1.4.1-1</jquery-cookie.version>