Run this script every 15 minutes

Check a table, and if there are subject ids or identifiers, then see if unresolvable, and if so, delete their memberships and privileges

Afterward delete from the table

Configure daemon

Output for a subject delete

subjectIdsFromQueryCount: 1, subjectIds: a-jsmith, subjectsResolvable: 0, membersNotFound: 0, membersCount: 1, deletedCount: 1, deleteFromTableCount: 1
scriptType: gsh
scriptSource: import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import edu.internet2.middleware.grouper.Gro...

null


GSH script

(configure the database, table, column, and subject source at the top)

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

import edu.internet2.middleware.grouper.GrouperSession;
import edu.internet2.middleware.grouper.Member;
import edu.internet2.middleware.grouper.app.loader.OtherJobScript;
import edu.internet2.middleware.grouper.app.usdu.UsduJob;
import edu.internet2.middleware.grouper.cfg.GrouperConfig;
import edu.internet2.middleware.grouper.misc.GrouperDAOFactory;
import edu.internet2.middleware.grouper.util.GrouperUtil;
import edu.internet2.middleware.grouperClient.jdbc.GcDbAccess;
import edu.internet2.middleware.subject.Subject;
import edu.internet2.middleware.subject.provider.SourceManager;

////uncomment to compile in eclipse (and last line)
//// these are standard imports, can be commented out in script but needed in eclipse
//
//
//public class Test24 {
//
//  public static void main(String[] args) throws Exception {
//
//    edu.internet2.middleware.grouper.misc.GrouperStartup.startup();

    // settings
    String databaseConfigId = "grouper";
    String table = "subjects_to_delete";
    String column = "subject_id";
    String sourceId = "personLdapSource";
    
    GrouperSession.startRootSession();

    Map<String, Object> debugMap = new LinkedHashMap<String, Object>();
    
    // get current batch
    List<String> subjectIds = new GcDbAccess().connectionName(databaseConfigId).sql("select distinct " + column + " from " + table).selectList(String.class);

    debugMap.put("subjectIdsFromQueryCount", GrouperUtil.length(subjectIds));
    
    // make total show up on ui
    OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setTotalCount(GrouperUtil.length(subjectIds));

    Set<Member> members = new HashSet<Member>();

    int subjectsResolvable = 0;
    int membersNotFound = 0;
    
    // resolve them and make sure unresolvable
    if (GrouperUtil.length(subjectIds) > 0) {
      
      debugMap.put("subjectIds", GrouperUtil.abbreviate(GrouperUtil.join(subjectIds.iterator(), ", "), 200));
      
      for (String subjectId : GrouperUtil.nonNull(subjectIds)) {
        
        // dont use cache here
        Subject subject = SourceManager.getInstance().getSource(sourceId).getSubjectByIdOrIdentifier(subjectId, false);
        
        if (subject != null) {
          OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().addInsertCount(1);
          subjectsResolvable++;
          continue;
        }
        
        Member member = GrouperDAOFactory.getFactory().getMember().findBySubject(subjectId, sourceId, false);
        if (member == null) {
          OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().addInsertCount(1);
          membersNotFound++;
          continue;
        }
        
        members.add(member);
      }
    }
    debugMap.put("subjectsResolvable", subjectsResolvable);
    debugMap.put("membersNotFound", membersNotFound);
    debugMap.put("membersCount", GrouperUtil.length(members));

    if (GrouperUtil.length(members) > 0) {
    
      int globalMaxAllowed = GrouperConfig.retrieveConfig().propertyValueInt("usdu.failsafe.maxUnresolvableSubjects", 500);
      
      boolean globalRemoveUpToFailSafe = GrouperConfig.retrieveConfig().propertyValueBoolean("usdu.failsafe.removeUpToFailsafe", false);
      int deletedCount = 0;
      if (members.size() > globalMaxAllowed) {
        
        if (!globalRemoveUpToFailSafe) {
          debugMap.put("failsafe", "For table "+table+" found " +
              members.size()+" unresolvable members. max limit is "+globalMaxAllowed+". "+
              "removeUpToFailsafe is set to false hence not going to delete any members.");
        } else {
          debugMap.put("failsafe", "For table "+table+" found " +
              members.size()+" unresolvable members. max limit is "+globalMaxAllowed+". "+
              "removeUpToFailsafe is set to true hence going to delete "+globalMaxAllowed+" members.");
          
          deletedCount += UsduJob.deleteUnresolvableMembers(members, globalMaxAllowed);
          
        }
        
      } else {
        deletedCount += UsduJob.deleteUnresolvableMembers(members, members.size());
      }
      debugMap.put("deletedCount", deletedCount);

      OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setDeleteCount(deletedCount);
    }
    if (GrouperUtil.length(subjectIds) > 0) {
      GcDbAccess gcDbAccess = new GcDbAccess().connectionName(databaseConfigId);
      gcDbAccess.sql("delete from " + table + " where " + column + " = ?");
      List<List<Object>> batchBindVars = new ArrayList<List<Object>>();
      for (String subjectId : subjectIds) {
        batchBindVars.add(GrouperUtil.toList(subjectId));
      }
      gcDbAccess.batchBindVars(batchBindVars);
      int[] results = gcDbAccess.executeBatchSql();
      int deleteCount = 0;
      for (int i=0; i<GrouperUtil.length(results); i++) {
        deleteCount += results[i];
      }
      debugMap.put("deleteFromTableCount", deleteCount);
    }

    OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().appendJobMessage(GrouperUtil.mapToString(debugMap));

//  }
//
//}
  • No labels