@Transactional(readOnly = true) @Override public void before(final PropagationTask task, final ConnectorObject beforeObj) { super.before(task, beforeObj); Provision provision = task.getResource().getProvision(anyTypeDAO.findGroup()); if (AnyTypeKind.USER == task.getAnyTypeKind() && provision.getMapping() != null) { User user = userDAO.find(task.getAnyKey()); if (user != null) { List<String> groupConnObjectLinks = new ArrayList<>(); for (Group group : userDAO.findAllGroups(user)) { if (group.getResourceNames().contains(task.getResource().getKey()) && StringUtils.isNotBlank(provision.getMapping().getConnObjectLink())) { LOG.debug("Evaluating connObjectLink for {}", group); JexlContext jexlContext = new MapContext(); JexlUtils.addFieldsToContext(group, jexlContext); JexlUtils.addPlainAttrsToContext(group.getPlainAttrs(), jexlContext); JexlUtils.addDerAttrsToContext(group, jexlContext); String groupConnObjectLinkLink = JexlUtils.evaluate(provision.getMapping().getConnObjectLink(), jexlContext); LOG.debug("ConnObjectLink for {} is '{}'", group, groupConnObjectLinkLink); if (StringUtils.isNotBlank(groupConnObjectLinkLink)) { groupConnObjectLinks.add(groupConnObjectLinkLink); } } } LOG.debug("Group connObjectLinks to propagate for membership: {}", groupConnObjectLinks); Set<Attribute> attributes = new HashSet<>(task.getAttributes()); Set<String> groups = new HashSet<>(groupConnObjectLinks); Attribute ldapGroups = AttributeUtil.find(getGroupMembershipAttrName(), attributes); if (ldapGroups != null) { for (Object obj : ldapGroups.getValue()) { groups.add(obj.toString()); } } attributes.add(AttributeBuilder.build(getGroupMembershipAttrName(), groups)); task.setAttributes(attributes); } } else { LOG.debug("Not about user, or group mapping missing for resource: not doing anything"); } }
@Test public void issue42() { PlainSchema userId = plainSchemaDAO.find("userId"); Set<MappingItem> beforeUserIdMappings = new HashSet<>(); for (ExternalResource res : resourceDAO.findAll()) { if (res.getProvision(anyTypeDAO.findUser()) != null && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) { for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) { if (userId.getKey().equals(mapItem.getIntAttrName())) { beforeUserIdMappings.add(mapItem); } } } } ResourceTO resourceTO = new ResourceTO(); resourceTO.setKey("resource-issue42"); resourceTO.setConnector(100L); resourceTO.setEnforceMandatoryCondition(true); ProvisionTO provisionTO = new ProvisionTO(); provisionTO.setAnyType(AnyTypeKind.USER.name()); provisionTO.setObjectClass(ObjectClass.ACCOUNT_NAME); resourceTO.getProvisions().add(provisionTO); MappingTO mapping = new MappingTO(); provisionTO.setMapping(mapping); MappingItemTO item = new MappingItemTO(); item.setIntAttrName("userId"); item.setIntMappingType(IntMappingType.UserPlainSchema); item.setExtAttrName("campo1"); item.setConnObjectKey(true); item.setMandatoryCondition("false"); item.setPurpose(MappingPurpose.BOTH); mapping.setConnObjectKeyItem(item); ExternalResource resource = resourceDataBinder.create(resourceTO); resource = resourceDAO.save(resource); assertNotNull(resource); assertNotNull(resource.getProvision(anyTypeDAO.findUser()).getMapping()); assertEquals(1, resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size()); resourceDAO.flush(); ExternalResource actual = resourceDAO.find("resource-issue42"); assertNotNull(actual); assertEquals(resource, actual); userId = plainSchemaDAO.find("userId"); Set<MappingItem> afterUserIdMappings = new HashSet<>(); for (ExternalResource res : resourceDAO.findAll()) { if (res.getProvision(anyTypeDAO.findUser()) != null && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) { for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) { if (userId.getKey().equals(mapItem.getIntAttrName())) { afterUserIdMappings.add(mapItem); } } } } assertEquals(beforeUserIdMappings.size(), afterUserIdMappings.size() - 1); }