in core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java [365:508]
protected void populateMapping(
final ExternalResource resource,
final Mapping mappingTO,
final Mapping mapping,
final AnyTypeKind anyTypeKind,
final AnyTypeClassTO allowedSchemas) {
mapping.setConnObjectLink(mappingTO.getConnObjectLink());
SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
SyncopeClientException invalidMapping = SyncopeClientException.build(ClientExceptionType.InvalidMapping);
SyncopeClientException requiredValuesMissing = SyncopeClientException.build(
ClientExceptionType.RequiredValuesMissing);
for (Item itemTO : mappingTO.getItems()) {
if (itemTO == null) {
LOG.error("Null {}", Item.class.getSimpleName());
invalidMapping.getElements().add("Null " + Item.class.getSimpleName());
} else if (itemTO.getIntAttrName() == null) {
requiredValuesMissing.getElements().add("intAttrName");
scce.addException(requiredValuesMissing);
} else {
IntAttrName intAttrName = null;
try {
intAttrName = intAttrNameParser.parse(itemTO.getIntAttrName(), anyTypeKind);
} catch (ParseException e) {
LOG.error("Invalid intAttrName '{}'", itemTO.getIntAttrName(), e);
}
if (intAttrName == null
|| intAttrName.getSchemaType() == null && intAttrName.getField() == null) {
LOG.error("'{}' not existing", itemTO.getIntAttrName());
invalidMapping.getElements().add('\'' + itemTO.getIntAttrName() + "' not existing");
} else {
boolean allowed = true;
if (intAttrName.getSchemaType() != null
&& intAttrName.getEnclosingGroup() == null
&& intAttrName.getRelatedAnyObject() == null
&& intAttrName.getRelationshipType() == null) {
switch (intAttrName.getSchemaType()) {
case PLAIN:
allowed = allowedSchemas.getPlainSchemas().contains(intAttrName.getSchema().getKey());
break;
case DERIVED:
allowed = allowedSchemas.getDerSchemas().contains(intAttrName.getSchema().getKey());
break;
default:
}
}
if (allowed) {
// no mandatory condition implies mandatory condition false
if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null
? "false" : itemTO.getMandatoryCondition())) {
SyncopeClientException invalidMandatoryCondition = SyncopeClientException.build(
ClientExceptionType.InvalidValues);
invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition());
scce.addException(invalidMandatoryCondition);
}
Item item = new Item();
item.setIntAttrName(itemTO.getIntAttrName());
item.setExtAttrName(itemTO.getExtAttrName());
item.setPurpose(itemTO.getPurpose());
item.setMandatoryCondition(itemTO.getMandatoryCondition());
item.setConnObjectKey(itemTO.isConnObjectKey());
item.setPassword(itemTO.isPassword());
item.setPropagationJEXLTransformer(itemTO.getPropagationJEXLTransformer());
item.setPullJEXLTransformer(itemTO.getPullJEXLTransformer());
itemTO.getTransformers().forEach(key -> implementationDAO.findById(key).ifPresentOrElse(
transformer -> item.getTransformers().add(transformer.getKey()),
() -> LOG.debug("Invalid {} {}, ignoring...",
Implementation.class.getSimpleName(), key)));
// remove all implementations not contained in the TO
item.getTransformers().
removeIf(implementation -> !itemTO.getTransformers().contains(implementation));
if (item.isConnObjectKey()) {
if ("password".equals(intAttrName.getField())) {
invalidMapping.getElements().add(
"Password attributes cannot be set as ConnObjectKey");
}
mapping.setConnObjectKeyItem(item);
} else {
mapping.add(item);
}
if (intAttrName.getEnclosingGroup() != null
&& item.getPurpose() != MappingPurpose.PROPAGATION) {
invalidMapping.getElements().add(
"Only " + MappingPurpose.PROPAGATION.name()
+ " allowed when referring to groups");
}
if (intAttrName.getRelatedAnyObject() != null
&& item.getPurpose() != MappingPurpose.PROPAGATION) {
invalidMapping.getElements().add(
"Only " + MappingPurpose.PROPAGATION.name()
+ " allowed when referring to any objects");
}
if (intAttrName.getSchemaType() == SchemaType.DERIVED
&& item.getPurpose() != MappingPurpose.PROPAGATION) {
invalidMapping.getElements().add(
"Only " + MappingPurpose.PROPAGATION.name() + " allowed for derived");
}
if (intAttrName.getRelatedUser() != null
&& item.getPurpose() != MappingPurpose.PROPAGATION) {
invalidMapping.getElements().add(
"Only " + MappingPurpose.PROPAGATION.name()
+ " allowed when referring to users");
}
if ((intAttrName.getRelationshipType() != null
|| intAttrName.getRelationshipAnyType() != null)
&& item.getPurpose() != MappingPurpose.PROPAGATION) {
invalidMapping.getElements().add(
"Only " + MappingPurpose.PROPAGATION.name()
+ " allowed when referring to relationships");
}
} else {
LOG.error("'{}' not allowed", itemTO.getIntAttrName());
invalidMapping.getElements().add('\'' + itemTO.getIntAttrName() + "' not allowed");
}
}
}
}
if (!invalidMapping.getElements().isEmpty()) {
scce.addException(invalidMapping);
}
if (scce.hasExceptions()) {
throw scce;
}
}