All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.internet2.middleware.grouperBox.GrouperWsCommandsForBox Maven / Gradle / Ivy

There is a newer version: 4.17.3
Show newest version
/**
 * @author mchyzer
 * $Id$
 */
package edu.internet2.middleware.grouperBox;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import edu.internet2.middleware.grouperClient.api.GcFindGroups;
import edu.internet2.middleware.grouperClient.api.GcGetMembers;
import edu.internet2.middleware.grouperClient.api.GcMessageAcknowledge;
import edu.internet2.middleware.grouperClient.api.GcMessageReceive;
import edu.internet2.middleware.grouperClient.util.ExpirableCache;
import edu.internet2.middleware.grouperClient.util.GrouperClientConfig;
import edu.internet2.middleware.grouperClient.util.GrouperClientUtils;
import edu.internet2.middleware.grouperClient.ws.beans.WsFindGroupsResults;
import edu.internet2.middleware.grouperClient.ws.beans.WsGetMembersResult;
import edu.internet2.middleware.grouperClient.ws.beans.WsGetMembersResults;
import edu.internet2.middleware.grouperClient.ws.beans.WsGroup;
import edu.internet2.middleware.grouperClient.ws.beans.WsMessage;
import edu.internet2.middleware.grouperClient.ws.beans.WsMessageResults;
import edu.internet2.middleware.grouperClient.ws.beans.WsQueryFilter;
import edu.internet2.middleware.grouperClient.ws.beans.WsSubject;


/**
 *
 */
public class GrouperWsCommandsForBox {

  /**
   * 
   */
  public GrouperWsCommandsForBox() {
  }

  /**
   * 
   * @param groupName
   * @return the list of users
   */
  public static Set retrieveGrouperMembershipsForGroup(String groupName) {

    
    //users that are supposed to be in box (do this at top so it doesnt affect the timing here
    Map usersAllowedToBeInBox = GrouperWsCommandsForBox.retrieveGrouperUsers();

    Map debugMap = new LinkedHashMap();
    
    debugMap.put("method", "retrieveGrouperMembershipsForGroup");
    debugMap.put("groupName", groupName);
    long startTime = System.nanoTime();
    try {
    
      String subjectAttributeForBoxUsername = GrouperBoxUtils.configSubjectAttributeForBoxUsername();
      
      Set grouperUsernamesInGroup = new TreeSet();

      GcGetMembers gcGetMembers = new GcGetMembers().addGroupName(groupName);
        
      // request extra attributes in WS call
      if (!GrouperClientUtils.equals("id", subjectAttributeForBoxUsername)) {
        gcGetMembers.addSubjectAttributeName(subjectAttributeForBoxUsername);
      }

      for (String sourceId : GrouperBoxUtils.configSourcesForSubjects()) {
        gcGetMembers.addSourceId(sourceId);
      }
      
      if (GrouperClientConfig.retrieveConfig().propertyValueBoolean("grouperBox.grouperWs.autopage", true)) {
        gcGetMembers.assignAutopage(true);
      }
      
      WsGetMembersResults wsGetMembersResults = gcGetMembers.execute();

      WsGetMembersResult wsGetMembersResult = wsGetMembersResults.getResults()[0];
        
      WsSubject[] wsSubjects = wsGetMembersResult == null ? null : wsGetMembersResult.getWsSubjects();
      //
      debugMap.put("originalMemberCount", GrouperClientUtils.length(wsSubjects));

      String[] attributeNames = wsGetMembersResults.getSubjectAttributeNames();

      int unresolvableCount = 0;
      int notAllowedInBoxCount = 0;
      
      //get usernames from grouper
      for (WsSubject wsSubject : GrouperClientUtils.nonNull(wsSubjects, WsSubject.class)) {
        String subjectPrefix = null;
        if (GrouperClientUtils.equals("id", subjectAttributeForBoxUsername)) {
          subjectPrefix = wsSubject.getId();
        } else {
          subjectPrefix = GrouperClientUtils.subjectAttributeValue(wsSubject, attributeNames, subjectAttributeForBoxUsername);
        }
        if (GrouperClientUtils.isBlank(subjectPrefix)) {
          //i guess this is ok
          debugMap.put("subjectBlankAttribute_" + wsSubject.getSourceId() + "_" + wsSubject.getId(), subjectAttributeForBoxUsername);
          unresolvableCount++;
        } else {
          String boxUserName = subjectPrefix
              + GrouperClientUtils.defaultIfBlank(GrouperClientConfig.retrieveConfig().propertyValueString("grouperBox.subjectIdSuffix"), "");
          if (usersAllowedToBeInBox == null || usersAllowedToBeInBox.containsKey(boxUserName)) {
            grouperUsernamesInGroup.add(boxUserName);
          } else {
            notAllowedInBoxCount++;
          }
        }
      }

      debugMap.put("finalMemberCount", GrouperClientUtils.length(grouperUsernamesInGroup));
      debugMap.put("unresolvableCount", unresolvableCount);
      debugMap.put("notAllowedInBoxCount", notAllowedInBoxCount);
      return grouperUsernamesInGroup;
    } catch (RuntimeException re) {
      debugMap.put("exception", GrouperClientUtils.getFullStackTrace(re));
      throw re;
    } finally {
      GrouperBoxLog.boxLog(debugMap, startTime);
    }

  }
  
  /**
   * @return list of groups never null
   */
  public static List retrieveGrouperGroups() {
    
    Map debugMap = new LinkedHashMap();
    
    debugMap.put("method", "retrieveGrouperGroups");
    long startTime = System.nanoTime();
    try {
    
      //# put groups in here which go to box, the name in box will be the extension here
      String grouperBoxFolderName = GrouperClientConfig.retrieveConfig().propertyValueStringRequired("grouperBox.folder.name.withBoxGroups");

      debugMap.put("grouperBoxFolderName", grouperBoxFolderName);

      WsQueryFilter wsQueryFilter = new WsQueryFilter();
      wsQueryFilter.setQueryFilterType("FIND_BY_STEM_NAME");
      wsQueryFilter.setStemName(grouperBoxFolderName);
      wsQueryFilter.setStemNameScope("ONE_LEVEL");
      
      WsFindGroupsResults wsFindGroupsResults = new GcFindGroups().assignQueryFilter(wsQueryFilter).execute();
    
      WsGroup[] wsGroupsArray = wsFindGroupsResults.getGroupResults();

      debugMap.put("numberOfGroups", GrouperClientUtils.length(wsGroupsArray));

      @SuppressWarnings("unchecked")
      List grouperGroups = wsGroupsArray == null ? new ArrayList() : (List)GrouperClientUtils.toList(wsGroupsArray);
      return grouperGroups;
      
    } catch (RuntimeException re) {
      debugMap.put("exception", GrouperClientUtils.getFullStackTrace(re));
      throw re;
    } finally {
      GrouperBoxLog.boxLog(debugMap, startTime);
    }

    
  }

  /**
   * cache of users in grouper
   */
  private static ExpirableCache> retrieveGrouperUsersCache = null;
  
  /**
   * lazy load return the cache of users
   * @return the cache
   */
  private static ExpirableCache> retrieveGrouperUsersCache() {
    if (retrieveGrouperUsersCache == null) {
      int expireMinutes = GrouperClientConfig.retrieveConfig().propertyValueInt("grouperBox.cacheGrouperUsersForMinutes", 60);
      retrieveGrouperUsersCache = new ExpirableCache(expireMinutes);
    }
    return retrieveGrouperUsersCache;
  }
  
  /**
   * return null if not configured to have such a group, otherwise the cached members of the group.  note, this is not a copy of the
   * cache, it can be edited
   * @return a map of boxUserName to array of [subjectId, sourceId, boxSubjectAttributeValue, boxUserName]
   */
  public static Map retrieveGrouperUsers() {
    
    Map result = retrieveGrouperUsersCache().get(Boolean.TRUE);
    if (result != null) {
      return result;
    }

    String boxGrouperRequireGroupName = GrouperClientConfig.retrieveConfig().propertyValueString("grouperBox.requireGroup");
    if (GrouperClientUtils.isBlank(boxGrouperRequireGroupName)) {
      return null;
    }

    Map debugMap = new LinkedHashMap();

    long startTimeNanos = System.nanoTime();

    debugMap.put("method", "retrieveGrouperUsers");

    try {
      result = new HashMap();
      
      GcGetMembers gcGetMembers = new GcGetMembers().addGroupName(boxGrouperRequireGroupName);
      
      for (String sourceId : GrouperBoxUtils.configSourcesForSubjects()) {
        gcGetMembers.addSourceId(sourceId);
      }
  
      String configSubjectAttributeForBoxUsername = GrouperBoxUtils.configSubjectAttributeForBoxUsername();
      
      debugMap.put("configSubjectAttributeForBoxUsername", configSubjectAttributeForBoxUsername);
      
      if (GrouperClientUtils.equals("id", configSubjectAttributeForBoxUsername)) {
  
        // in the utils method below this is what it expects
        configSubjectAttributeForBoxUsername = "subject__id"; 
      } else {
        gcGetMembers.addSubjectAttributeName(configSubjectAttributeForBoxUsername);
      }
      
      if (GrouperClientConfig.retrieveConfig().propertyValueBoolean("grouperBox.grouperWs.autopage", true)) {
        gcGetMembers.assignAutopage(true);
      }

      WsGetMembersResults wsGetMembersResults = gcGetMembers.execute();
      WsGetMembersResult wsGetMembersResult = wsGetMembersResults.getResults()[0];
      
      debugMap.put("resultSize", GrouperClientUtils.length(wsGetMembersResult.getWsSubjects()));

      String subjectSuffix = GrouperClientUtils.defaultIfBlank(GrouperClientConfig.retrieveConfig().propertyValueString("grouperBox.subjectIdSuffix"), "");

      debugMap.put("subjectSuffix", subjectSuffix);

      for (WsSubject wsSubject: GrouperClientUtils.nonNull(wsGetMembersResult.getWsSubjects(), WsSubject.class)) {
        String usernameValueWithoutSuffix = GrouperClientUtils.subjectAttributeValue(wsSubject, wsGetMembersResults.getSubjectAttributeNames(), configSubjectAttributeForBoxUsername);
        String boxUsername = usernameValueWithoutSuffix + subjectSuffix;
        String[] userArray = new String[]{wsSubject.getId(), wsSubject.getSourceId(), usernameValueWithoutSuffix, boxUsername};
        result.put(boxUsername, userArray);
      }
      
      retrieveGrouperUsersCache().put(Boolean.TRUE, result);
    } finally {
      GrouperBoxLog.boxLog(debugMap, startTimeNanos);
    }
    
    return result;
  }

  /**
   * 
   * @return the messages
   */
  public static WsMessage[] grouperReceiveMessages() {

    Map debugMap = new LinkedHashMap();

    long startTimeNanos = System.nanoTime();

    debugMap.put("method", "grouperReceiveMessages");

    try {
      String messageSystemName = GrouperClientConfig.retrieveConfig()
          .propertyValueStringRequired("grouperBox.messaging.systemName");

      debugMap.put("messageSystemName", messageSystemName);
      
      String messageQueueName = GrouperClientConfig.retrieveConfig()
          .propertyValueStringRequired("grouperBox.messaging.queueName");

      debugMap.put("messageQueueName", messageQueueName);

      WsMessageResults wsMessageResults = new GcMessageReceive()
        .assignMessageSystemName(messageSystemName).assignQueueOrTopicName(messageQueueName).execute();

      debugMap.put("checkMessagesWsResultCode", wsMessageResults.getResultMetadata().getResultCode());
      debugMap.put("messageCount", GrouperClientUtils.length(wsMessageResults.getMessages()));

      return wsMessageResults.getMessages();
    } finally {
      GrouperBoxLog.boxLog(debugMap, startTimeNanos);
    }

  }
  
  /**
   * @param ids
   * @param acknowledgeType mark_as_processed, return_to_queue, return_to_end_of_queue,  send_to_another_queue
   */
  public static void grouperAcknowledgeMessages(Set ids, String acknowledgeType) {

    Map debugMap = new LinkedHashMap();

    long startTimeNanos = System.nanoTime();

    debugMap.put("method", "grouperAcknowledgeMessages");
    debugMap.put("numberOfIds", GrouperClientUtils.length(ids));
    debugMap.put("acknowledgeType", acknowledgeType);

    try {
      String messageSystemName = GrouperClientConfig.retrieveConfig()
          .propertyValueStringRequired("grouperBox.messaging.systemName");

      debugMap.put("messageSystemName", messageSystemName);
      
      String messageQueueName = GrouperClientConfig.retrieveConfig()
          .propertyValueStringRequired("grouperBox.messaging.queueName");

      debugMap.put("messageQueueName", messageQueueName);


      GcMessageAcknowledge successMessageAcknowledge = null;
      successMessageAcknowledge = new GcMessageAcknowledge()
        .assignMessageSystemName(messageSystemName).assignQueueOrTopicName(messageQueueName).assignAcknowledgeType(acknowledgeType);
      
      for (String id : ids) {
        //mark message as processed
        successMessageAcknowledge.addMessageId(id);
      }
      
      successMessageAcknowledge.execute();
      
    } finally {
      GrouperBoxLog.boxLog(debugMap, startTimeNanos);
    }

  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy