Skip to content

Commit 7a5c697

Browse files
committed
Adjusting Realm propagation
1 parent d4aed33 commit 7a5c697

File tree

7 files changed

+87
-52
lines changed

7 files changed

+87
-52
lines changed

core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/rules/PushCorrelationRule.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
package org.apache.syncope.core.provisioning.api.rules;
2020

21-
import java.util.function.BiFunction;
21+
import java.util.function.Function;
2222
import org.apache.syncope.common.lib.policy.PushCorrelationRuleConf;
2323
import org.apache.syncope.common.lib.to.Provision;
2424
import org.apache.syncope.core.persistence.api.entity.Any;
@@ -36,8 +36,8 @@ public interface PushCorrelationRule {
3636
/**
3737
* Default FIQL builder using __UID__.
3838
*/
39-
BiFunction<ConnectorObject, Provision, String> DEFAULT_FIQL_BUILDER =
40-
(connectorObject, provision) -> Uid.NAME + "==" + connectorObject.getUid().getUidValue();
39+
Function<ConnectorObject, String> DEFAULT_FIQL_BUILDER =
40+
connectorObject -> Uid.NAME + "==" + connectorObject.getUid().getUidValue();
4141

4242
default void setConf(PushCorrelationRuleConf conf) {
4343
}
@@ -62,6 +62,6 @@ default void setConf(PushCorrelationRuleConf conf) {
6262
* @return fiql
6363
*/
6464
default String getFIQL(ConnectorObject connectorObject, Provision provision) {
65-
return DEFAULT_FIQL_BUILDER.apply(connectorObject, provision);
65+
return DEFAULT_FIQL_BUILDER.apply(connectorObject);
6666
}
6767
}

core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyDataBinder.java

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import org.apache.syncope.common.lib.types.AttrSchemaType;
4848
import org.apache.syncope.common.lib.types.ClientExceptionType;
4949
import org.apache.syncope.common.lib.types.PatchOperation;
50-
import org.apache.syncope.common.lib.types.ResourceOperation;
5150
import org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager;
5251
import org.apache.syncope.core.persistence.api.dao.AllowedSchemas;
5352
import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -82,7 +81,6 @@
8281
import org.apache.syncope.core.provisioning.api.IntAttrNameParser;
8382
import org.apache.syncope.core.provisioning.api.MappingManager;
8483
import org.apache.syncope.core.provisioning.api.PlainAttrGetter;
85-
import org.apache.syncope.core.provisioning.api.PropagationByResource;
8684
import org.apache.syncope.core.provisioning.api.jexl.JexlTools;
8785
import org.apache.syncope.core.provisioning.java.pushpull.OutboundMatcher;
8886
import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
@@ -505,32 +503,6 @@ protected void fill(
505503
}
506504
}
507505

508-
protected PropagationByResource<String> propByRes(
509-
final Map<String, ConnObject> before,
510-
final Map<String, ConnObject> after) {
511-
512-
PropagationByResource<String> propByRes = new PropagationByResource<>();
513-
514-
after.forEach((resource, connObject) -> {
515-
if (before.containsKey(resource)) {
516-
ConnObject beforeObject = before.get(resource);
517-
if (!beforeObject.equals(connObject)) {
518-
propByRes.add(ResourceOperation.UPDATE, resource);
519-
520-
beforeObject.getAttr(Uid.NAME).map(attr -> attr.getValues().getFirst()).
521-
ifPresent(value -> propByRes.addOldConnObjectKey(resource, value));
522-
}
523-
} else {
524-
propByRes.add(ResourceOperation.CREATE, resource);
525-
}
526-
});
527-
propByRes.addAll(
528-
ResourceOperation.DELETE,
529-
before.keySet().stream().filter(resource -> !after.containsKey(resource)).collect(Collectors.toSet()));
530-
531-
return propByRes;
532-
}
533-
534506
protected void fill(
535507
final AnyTO anyTO,
536508
final Any any,

core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AttributableDataBinder.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222
import java.util.Map;
2323
import java.util.Optional;
2424
import java.util.concurrent.ConcurrentHashMap;
25+
import java.util.stream.Collectors;
2526
import org.apache.commons.lang3.StringUtils;
2627
import org.apache.syncope.common.lib.SyncopeClientException;
2728
import org.apache.syncope.common.lib.to.AttributableTO;
29+
import org.apache.syncope.common.lib.to.ConnObject;
30+
import org.apache.syncope.common.lib.types.ResourceOperation;
2831
import org.apache.syncope.core.persistence.api.attrvalue.DropdownValueProvider;
2932
import org.apache.syncope.core.persistence.api.attrvalue.InvalidPlainAttrValueException;
3033
import org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager;
@@ -35,8 +38,10 @@
3538
import org.apache.syncope.core.provisioning.api.DerAttrHandler;
3639
import org.apache.syncope.core.provisioning.api.IntAttrNameParser;
3740
import org.apache.syncope.core.provisioning.api.MappingManager;
41+
import org.apache.syncope.core.provisioning.api.PropagationByResource;
3842
import org.apache.syncope.core.provisioning.api.jexl.JexlTools;
3943
import org.apache.syncope.core.spring.implementation.ImplementationManager;
44+
import org.identityconnectors.framework.common.objects.Uid;
4045
import org.slf4j.Logger;
4146
import org.slf4j.LoggerFactory;
4247

@@ -169,4 +174,30 @@ protected void fillAttr(
169174
}
170175
});
171176
}
177+
178+
protected PropagationByResource<String> propByRes(
179+
final Map<String, ConnObject> before,
180+
final Map<String, ConnObject> after) {
181+
182+
PropagationByResource<String> propByRes = new PropagationByResource<>();
183+
184+
after.forEach((resource, connObject) -> {
185+
if (before.containsKey(resource)) {
186+
ConnObject beforeObject = before.get(resource);
187+
if (!beforeObject.equals(connObject)) {
188+
propByRes.add(ResourceOperation.UPDATE, resource);
189+
190+
beforeObject.getAttr(Uid.NAME).map(attr -> attr.getValues().getFirst()).
191+
ifPresent(value -> propByRes.addOldConnObjectKey(resource, value));
192+
}
193+
} else {
194+
propByRes.add(ResourceOperation.CREATE, resource);
195+
}
196+
});
197+
propByRes.addAll(
198+
ResourceOperation.DELETE,
199+
before.keySet().stream().filter(resource -> !after.containsKey(resource)).collect(Collectors.toSet()));
200+
201+
return propByRes;
202+
}
172203
}

core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,18 @@
2020

2121
import java.text.ParseException;
2222
import java.util.ArrayList;
23+
import java.util.HashMap;
2324
import java.util.List;
25+
import java.util.Map;
2426
import java.util.Optional;
27+
import org.apache.commons.lang3.StringUtils;
2528
import org.apache.syncope.common.lib.Attr;
2629
import org.apache.syncope.common.lib.SyncopeClientCompositeException;
2730
import org.apache.syncope.common.lib.SyncopeClientException;
31+
import org.apache.syncope.common.lib.to.ConnObject;
2832
import org.apache.syncope.common.lib.to.RealmTO;
2933
import org.apache.syncope.common.lib.types.AttrSchemaType;
3034
import org.apache.syncope.common.lib.types.ClientExceptionType;
31-
import org.apache.syncope.common.lib.types.ResourceOperation;
3235
import org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager;
3336
import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
3437
import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
@@ -59,7 +62,13 @@
5962
import org.apache.syncope.core.provisioning.api.data.RealmDataBinder;
6063
import org.apache.syncope.core.provisioning.api.jexl.JexlTools;
6164
import org.apache.syncope.core.provisioning.api.jexl.TemplateUtils;
65+
import org.apache.syncope.core.provisioning.api.rules.PushCorrelationRule;
66+
import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
6267
import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
68+
import org.identityconnectors.framework.common.objects.AttributeBuilder;
69+
import org.identityconnectors.framework.common.objects.ConnectorObject;
70+
import org.identityconnectors.framework.common.objects.ConnectorObjectBuilder;
71+
import org.identityconnectors.framework.common.objects.Uid;
6372

6473
public class RealmDataBinderImpl extends AttributableDataBinder implements RealmDataBinder {
6574

@@ -281,36 +290,59 @@ public Realm create(final Realm parent, final RealmTO realmTO) {
281290
return realm;
282291
}
283292

293+
protected Map<String, ConnObject> onResources(final Realm realm) {
294+
Map<String, ConnObject> onResources = new HashMap<>();
295+
296+
realm.getResources().forEach(resource -> Optional.ofNullable(resource.getOrgUnit()).
297+
ifPresent(orgUnit -> orgUnit.getConnObjectKeyItem().ifPresent(keyItem -> {
298+
299+
MappingManager.PreparedAttrs prepared = mappingManager.prepareAttrsFromRealm(realm, resource);
300+
301+
ConnObject connObjectTO;
302+
if (StringUtils.isBlank(prepared.connObjectLink())) {
303+
connObjectTO = ConnObjectUtils.getConnObjectTO(null, prepared.attributes());
304+
} else {
305+
ConnectorObject connectorObject = new ConnectorObjectBuilder().
306+
addAttributes(prepared.attributes()).
307+
addAttribute(new Uid(prepared.connObjectLink())).
308+
addAttribute(AttributeBuilder.build(keyItem.getExtAttrName(), prepared.connObjectLink())).
309+
build();
310+
311+
connObjectTO = ConnObjectUtils.getConnObjectTO(
312+
PushCorrelationRule.DEFAULT_FIQL_BUILDER.apply(connectorObject),
313+
connectorObject.getAttributes());
314+
}
315+
316+
onResources.put(resource.getKey(), connObjectTO);
317+
})));
318+
319+
return onResources;
320+
}
321+
284322
@Override
285323
public PropagationByResource<String> update(final Realm realm, final RealmTO realmTO) {
324+
// Save projection on Resources (before update)
325+
Map<String, ConnObject> beforeOnResources = onResources(realm);
326+
286327
realm.setParent(Optional.ofNullable(realmTO.getParent()).flatMap(realmDAO::findById).orElse(null));
287328

288329
SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
289330

290331
bind(realm, realmTO, scce);
291332

292-
PropagationByResource<String> propByRes = new PropagationByResource<>();
293333
realmTO.getResources().forEach(key -> resourceDAO.findById(key).ifPresentOrElse(
294-
resource -> {
295-
realm.add(resource);
296-
propByRes.add(ResourceOperation.CREATE, resource.getKey());
297-
},
334+
realm::add,
298335
() -> LOG.debug("Invalid {} {}, ignoring...", ExternalResource.class.getSimpleName(), key)));
299336
// remove all resources not contained in the TO
300-
realm.getResources().removeIf(resource -> {
301-
boolean contained = realmTO.getResources().contains(resource.getKey());
302-
if (!contained) {
303-
propByRes.add(ResourceOperation.DELETE, resource.getKey());
304-
}
305-
return !contained;
306-
});
337+
realm.getResources().removeIf(resource -> !realmTO.getResources().contains(resource.getKey()));
307338

308339
SyncopeClientException requiredValuesMissing = checkMandatoryOnResources(realm);
309340
if (!requiredValuesMissing.isEmpty()) {
310341
scce.addException(requiredValuesMissing);
311342
}
312343

313-
return propByRes;
344+
// Build final information for next stage (propagation)
345+
return propByRes(beforeOnResources, onResources(realm));
314346
}
315347

316348
@Override

core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultPushCorrelationRule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ public class DefaultPushCorrelationRule implements PushCorrelationRule {
6060

6161
@Override
6262
public void setConf(final PushCorrelationRuleConf conf) {
63-
if (conf instanceof DefaultPushCorrelationRuleConf) {
64-
this.conf = DefaultPushCorrelationRuleConf.class.cast(conf);
63+
if (conf instanceof final DefaultPushCorrelationRuleConf defaultPushCorrelationRuleConf) {
64+
this.conf = defaultPushCorrelationRuleConf;
6565
} else {
6666
throw new IllegalArgumentException(
6767
DefaultPushCorrelationRuleConf.class.getName() + " expected, got " + conf.getClass().getName());

core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/OutboundMatcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public String getFIQL(
105105

106106
return rule(resource, provision).
107107
map(rule -> rule.getFIQL(connectorObject, provision)).
108-
orElseGet(() -> PushCorrelationRule.DEFAULT_FIQL_BUILDER.apply(connectorObject, provision));
108+
orElseGet(() -> PushCorrelationRule.DEFAULT_FIQL_BUILDER.apply(connectorObject));
109109
}
110110

111111
public List<ConnectorObject> match(

core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import org.apache.commons.lang3.ArrayUtils;
3030
import org.apache.commons.lang3.StringUtils;
3131
import org.apache.syncope.common.lib.to.Item;
32-
import org.apache.syncope.common.lib.to.Mapping;
32+
import org.apache.syncope.common.lib.to.ItemContainer;
3333
import org.apache.syncope.common.lib.to.Provision;
3434
import org.apache.syncope.common.lib.types.MappingPurpose;
3535
import org.apache.syncope.core.persistence.api.ApplicationContextProvider;
@@ -55,8 +55,8 @@ public final class MappingUtils {
5555
public static Optional<Item> getConnObjectKeyItem(final Provision provision) {
5656
return Optional.ofNullable(provision).
5757
flatMap(p -> Optional.ofNullable(p.getMapping())).
58-
map(Mapping::getConnObjectKeyItem).
59-
orElseGet(Optional::empty);
58+
map(ItemContainer::getConnObjectKeyItem).
59+
orElseGet(Optional::empty);
6060
}
6161

6262
public static Stream<Item> getPropagationItems(final Stream<Item> items) {

0 commit comments

Comments
 (0)