This script daemon will load a group from a google sheet.

You can adjust the authentication, but this simple example will just use an API key to a sheet which can be read from a link

Setup authentication

Allow google sheet access

Get an API key

Put the API key in a grouper config

Make the sheet


Make a GSH script daemon (adjust code)


Code

import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;

import edu.internet2.middleware.grouper.Group;
import edu.internet2.middleware.grouper.GroupFinder;
import edu.internet2.middleware.grouper.GrouperSession;
import edu.internet2.middleware.grouper.Member;
import edu.internet2.middleware.grouper.MemberFinder;
import edu.internet2.middleware.grouper.SubjectFinder;
import edu.internet2.middleware.grouper.app.loader.OtherJobScript;
import edu.internet2.middleware.grouper.cfg.GrouperConfig;
import edu.internet2.middleware.grouper.misc.GrouperStartup;
import edu.internet2.middleware.grouper.util.GrouperHttpClient;
import edu.internet2.middleware.grouper.util.GrouperHttpMethod;
import edu.internet2.middleware.grouper.util.GrouperUtil;
import edu.internet2.middleware.grouperClient.jdbc.GcDbAccess;
import edu.internet2.middleware.subject.Subject;

//public class Test84googleSheets {
//  
//  public static void main(String[] args) {
//    
//    GrouperStartup.startup();
    GrouperSession grouperSession = GrouperSession.startRootSession();
    
    Map<String, Object> debugMap = new LinkedHashMap<>();

    String apiKey = GrouperConfig.retrieveConfig().propertyValueStringRequired("someTempGoogleKey");
    
    String jsonResponse = new GrouperHttpClient().assignGrouperHttpMethod(GrouperHttpMethod.get).
      assignUrl("https://sheets.googleapis.com/v4/spreadsheets/1c_abc123/values/Sheet1?key=" + apiKey).
      assignAssertResponseCode(200).executeRequest().getResponseBody();
    
    //  {
    //    "range": "Sheet1!A1:Z1000",
    //    "majorDimension": "ROWS",
    //    "values": [
    //      [
    //        "Users"
    //      ],
    //      [
    //        "mchyzer"
    //      ],
    //      [
    //        "kwilso"
    //      ]
    //    ]
    //  }
    JsonNode jsonNode = GrouperUtil.jsonJacksonNode(jsonResponse);
    ArrayNode arrayNode = GrouperUtil.jsonJacksonGetArrayNode(jsonNode, "values");
    ArrayNode firstRowArray = (ArrayNode)arrayNode.get(0);
    String firstColHeader = GrouperUtil.jsonJacksonGetString(firstRowArray, 0);
    GrouperUtil.assertion(StringUtils.equals(firstColHeader, "Users"), "Header of first col should be 'Users', '" + firstColHeader + "'");
    
    Set<String> subjectIdentifiersGoogleSheet = new HashSet<String>();
    for (int i=1;i<arrayNode.size();i++) {
      ArrayNode rowArray = (ArrayNode)arrayNode.get(i);
      String subjectIdentifier = GrouperUtil.jsonJacksonGetString(rowArray, 0);
      if (!StringUtils.isBlank(subjectIdentifier)) {
        subjectIdentifiersGoogleSheet.add(subjectIdentifier);
      }
    }

    if (OtherJobScript.retrieveFromThreadLocal() != null) {
      OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setTotalCount(subjectIdentifiersGoogleSheet.size());
    }
    
    Map<String, Subject> subjectIdentifierToSubject = GrouperUtil.nonNull(subjectIdentifiersGoogleSheet.size() == 0 ? null : 
      SubjectFinder.findByIdentifiers(subjectIdentifiersGoogleSheet, "pennperson"));
    
    if (subjectIdentifiersGoogleSheet.size() != subjectIdentifierToSubject.size()) {
      if (OtherJobScript.retrieveFromThreadLocal() != null) {
        OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setUnresolvableSubjectCount(
            subjectIdentifiersGoogleSheet.size() - subjectIdentifierToSubject.size());
      }
      Set<String> unresolvables = new HashSet<String>(subjectIdentifiersGoogleSheet);
      unresolvables.removeAll(subjectIdentifierToSubject.keySet());
      debugMap.put("unresolvables", GrouperUtil.toStringForLog(unresolvables));
    }
    
    Group group = GroupFinder.findByName("test:testGshLoader", true);
    int updates = group.replaceMembers(subjectIdentifierToSubject.values());
    
    if (OtherJobScript.retrieveFromThreadLocal() != null) {
      OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setUpdateCount(updates);
      OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().appendJobMessage(GrouperUtil.mapToString(debugMap));
    } else {
      System.exit(0);
    }
    
    GrouperSession.stopQuietly(grouperSession);
    
//  }
//}


See daemon run

See group memberships

(note make this group before running the daemon)


  • No labels