-
Notifications
You must be signed in to change notification settings - Fork 188
/
UpdateModificationConverter.java
97 lines (85 loc) · 4.36 KB
/
UpdateModificationConverter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
* Copyright (c) 2010-2018 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.provisioning.ucf.impl.connid;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.identityconnectors.framework.common.objects.Attribute;
import org.identityconnectors.framework.common.objects.AttributeBuilder;
import com.evolveum.midpoint.prism.delta.PlusMinusZero;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
/**
* @author semancik
*/
public class UpdateModificationConverter extends AbstractModificationConverter {
private final Set<Attribute> attributesToAdd = new HashSet<>();
private final Set<Attribute> attributesToUpdate = new HashSet<>();
private final Set<Attribute> attributesToRemove = new HashSet<>();
public Set<Attribute> getAttributesToAdd() {
return attributesToAdd;
}
public Set<Attribute> getAttributesToUpdate() {
return attributesToUpdate;
}
public Set<Attribute> getAttributesToRemove() {
return attributesToRemove;
}
@Override
protected <T> void collect(String connIdAttrName, PropertyDelta<T> delta,
PlusMinusZero isInModifiedAuxiliaryClass, CollectorValuesConverter<T> valuesConverter)
throws SchemaException {
if (delta.isAdd()) {
List<Object> connIdAttributeValues = valuesConverter.covertAttributeValuesToConnId(delta.getValuesToAdd(), delta.getElementName());
if (delta.getDefinition().isMultiValue()) {
attributesToAdd.add(AttributeBuilder.build(connIdAttrName, connIdAttributeValues));
} else {
// Force "update" for single-valued attributes instead of "add". This is saving one
// read in some cases. It should also make no substantial difference in such case.
// But it is working around some connector bugs.
attributesToUpdate.add(AttributeBuilder.build(connIdAttrName, connIdAttributeValues));
}
}
if (delta.isDelete()) {
if (delta.getDefinition().isMultiValue() || isInModifiedAuxiliaryClass == PlusMinusZero.MINUS) {
List<Object> connIdAttributeValues = valuesConverter.covertAttributeValuesToConnId(delta.getValuesToDelete(), delta.getElementName());
attributesToRemove.add(AttributeBuilder.build(connIdAttrName, connIdAttributeValues));
} else {
// Force "update" for single-valued attributes instead of "add". This is saving one
// read in some cases.
// Update attribute to no values. This will efficiently clean up the attribute.
// It should also make no substantial difference in such case.
// But it is working around some connector bugs.
// update with EMPTY value. The connIdAttributeValues is NOT used in this branch
attributesToUpdate.add(AttributeBuilder.build(connIdAttrName));
}
}
if (delta.isReplace()) {
List<Object> connIdAttributeValues = valuesConverter.covertAttributeValuesToConnId(delta.getValuesToReplace(), delta.getElementName());
if (isInModifiedAuxiliaryClass == PlusMinusZero.PLUS) {
attributesToAdd.add(AttributeBuilder.build(connIdAttrName, connIdAttributeValues));
} else {
attributesToUpdate.add(AttributeBuilder.build(connIdAttrName, connIdAttributeValues));
}
}
}
@Override
protected <T> void collectReplace(String connIdAttrName, T connIdAttrValue) {
if (connIdAttrValue == null) {
attributesToUpdate.add(AttributeBuilder.build(connIdAttrName));
} else {
attributesToUpdate.add(AttributeBuilder.build(connIdAttrName, connIdAttrValue));
}
}
@Override
protected void debugDumpOutput(StringBuilder sb, int indent) {
DebugUtil.debugDumpWithLabelLn(sb, "attributesToAdd", attributesToAdd, indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, "attributesToUpdate", attributesToUpdate, indent + 1);
DebugUtil.debugDumpWithLabelLn(sb, "attributesToRemove", attributesToRemove, indent + 1);
}
}