/* * **************************************************************************** * Cloud Foundry * Copyright (c) [2009-2017] Pivotal Software, Inc. All Rights Reserved. * * This product is licensed to you under the Apache License, Version 2.0 (the "License"). * You may not use this product except in compliance with the License. * * This product includes a number of subcomponents with * separate copyright notices and license terms. Your use of these * subcomponents is subject to the terms and conditions of the * subcomponent's license, as noted in the LICENSE file. * **************************************************************************** */ package org.cloudfoundry.identity.uaa.impl.config; import org.apache.commons.collections.ListUtils; import org.cloudfoundry.identity.uaa.constants.OriginKeys; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class ScimExternalGroupsTypeResolvingFactoryBean { public ScimExternalGroupsTypeResolvingFactoryBean(Object o) { // Supported list of pipe-delimited internal to external group mappings with space-separated external groups if (o instanceof List) { Map<String, Map<String, List>> resolvedMap = new HashMap(); for (String internalToExternalGroupsMapping : ((List<String>) o)) { String[] internalExternalOrigin = internalToExternalGroupsMapping.trim().split("\\|"); if (internalExternalOrigin.length <= 1) { continue; } String internalGroup = internalExternalOrigin[0]; String externalGroupsSpaceDelimited = internalExternalOrigin[1]; String origin = OriginKeys.LDAP; if (internalExternalOrigin.length >= 3) { origin = internalExternalOrigin[2]; } String[] externalGroups = externalGroupsSpaceDelimited.trim().split("\\s+"); Map<String, List> externalToInternalMap = new HashMap<>(); for (String externalGroup : externalGroups) { externalToInternalMap.put(externalGroup, Arrays.asList(internalGroup)); } Map<String, List> existingOriginMap = resolvedMap.putIfAbsent(origin, externalToInternalMap); if (existingOriginMap != null) { Map<String, List> originMap = resolvedMap.get(origin); Map<String, List> combinedMap = new HashMap<>(originMap); for (Map.Entry<String, List> e : externalToInternalMap.entrySet()) { combinedMap.merge(e.getKey(), e.getValue(), ListUtils::union); } resolvedMap.put(origin, combinedMap); } } externalGroups = resolvedMap; } else { externalGroups = new HashMap<>((Map<String, Map<String, List>>) o); } } private Map<String, Map<String, List>> externalGroups; public Map<String, Map<String, List>> getExternalGroups() { return externalGroups; } public void setExternalGroups(Map<String, Map<String, List>> groups) { this.externalGroups = groups; } }