package org.apereo.cas.grouper; import edu.internet2.middleware.grouperClient.api.GcGetGroups; import edu.internet2.middleware.grouperClient.ws.beans.WsGetGroupsResult; import edu.internet2.middleware.grouperClient.ws.beans.WsGroup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * This is {@link GrouperFacade} that acts as a wrapper * in front of the grouper API. * * @author Misagh Moayyed * @since 5.1.0 */ public class GrouperFacade { private static final Logger LOGGER = LoggerFactory.getLogger(GrouperFacade.class); protected GrouperFacade() {} /** * Construct grouper group attribute. * This is the name of every individual group attribute * transformed into a CAS attribute value. * * @param groupField the group field * @param group the group * @return the final attribute name */ public static String getGrouperGroupAttribute(final GrouperGroupField groupField, final WsGroup group) { switch (groupField) { case DISPLAY_EXTENSION: return group.getDisplayExtension(); case DISPLAY_NAME: return group.getDisplayName(); case EXTENSION: return group.getExtension(); case NAME: default: return group.getName(); } } /** * Gets groups for subject id. * * @param subjectId the principal * @return the groups for subject id */ public static List<WsGetGroupsResult> getGroupsForSubjectId(final String subjectId) { try { final GcGetGroups groupsClient = new GcGetGroups().addSubjectId(subjectId); final WsGetGroupsResult[] results = groupsClient.execute().getResults(); if (results == null || results.length == 0) { LOGGER.warn("Subject id [{}] could not be located.", subjectId); return Collections.emptyList(); } LOGGER.debug("Found [{}] groups for [{}]", results.length, subjectId); return Arrays.asList(results); } catch (final Exception e) { LOGGER.warn("Grouper WS did not respond successfully. Ensure your credentials are correct " + ", the url endpoint for Grouper WS is correctly configured and the subject [{}]" + " exists in Grouper.", subjectId, e); } return Collections.emptyList(); } }