Syncing objects to Grouper from SQL

Syncing objects to Grouper from SQL

This feature is available in Grouper v2.5.44+.  If you are running large syncs make sure your daemon has a lot of memory and that large jobs do not run at the same time

This example shows you can provide your own SQL.  If you are syncing from another Grouper instance you can let Grouper automatically generate the queries and detect which columns are available.

Example from training environment

  1. Get the env up and running, identify some folders to sync.  Lets get the app:vpn and the ref folders



  2. We need a database connection to that database from our database



  3. Note: you need a consistent subject source



    subjectApi.source.ldap.id = ldap subjectApi.source.ldap.name = EDU Ldap subjectApi.source.ldap.types = person subjectApi.source.ldap.adapterClass = edu.internet2.middleware.grouper.subj.GrouperJndiSourceAdapter subjectApi.source.ldap.param.ldapServerId.value = grouperTrainingLdap subjectApi.source.ldap.param.SubjectID_AttributeType.value = uid subjectApi.source.ldap.param.SubjectID_formatToLowerCase.value = false subjectApi.source.ldap.param.Name_AttributeType.value = cn subjectApi.source.ldap.param.Description_AttributeType.value = cn subjectApi.source.ldap.param.VTLDAP_VALIDATOR.value = ConnectLdapValidator subjectApi.source.ldap.param.SubjectID_AttributeType.value = uid subjectApi.source.ldap.param.SubjectID_formatToLowerCase.value = false subjectApi.source.ldap.param.Name_AttributeType.value = cn subjectApi.source.ldap.param.Description_AttributeType.value = cn subjectApi.source.ldap.param.subjectVirtualAttribute_0_searchAttribute0.value = ${subjectUtils.defaultIfBlank(subject.getAttributeValueOrCommaSeparated('uid'), "")},${subjectUtils.defaultIfBlank(subject.getAttributeValueOrCommaSeparated('cn'), "")},${subjectUtils.defaultIfBlank(subject.getAttributeValueOrCommaSeparated('exampleEduRegId'), "")} subjectApi.source.ldap.param.sortAttribute0.value = cn subjectApi.source.ldap.param.searchAttribute0.value = searchAttribute0 subjectApi.source.ldap.param.subjectIdentifierAttribute0.value = employeeNumber subjectApi.source.ldap.search.searchSubject.param.filter.value = (&(uid=%TERM%)(objectclass=person)) subjectApi.source.ldap.search.searchSubject.param.scope.value = SUBTREE_SCOPE subjectApi.source.ldap.search.searchSubject.param.base.value = ou=people,dc=internet2,dc=edu subjectApi.source.ldap.search.searchSubjectByIdentifier.param.filter.value = (&(employeeNumber=%TERM%)(objectclass=person)) subjectApi.source.ldap.search.searchSubjectByIdentifier.param.scope.value = SUBTREE_SCOPE subjectApi.source.ldap.search.searchSubjectByIdentifier.param.base.value = ou=people,dc=internet2,dc=edu subjectApi.source.ldap.search.search.param.filter.value = (&(|(|(uid=%TERM%)(cn=*%TERM%*))(uid=%TERM%*))(objectclass=person)) subjectApi.source.ldap.search.search.param.scope.value = SUBTREE_SCOPE subjectApi.source.ldap.search.search.param.base.value = ou=people,dc=internet2,dc=edu subjectApi.source.ldap.internalAttributes = searchAttribute0
  4. Configure the sync to grouper from the training env

    Use these queries, adjust the where clause so it matches the folders you want to sync.  Run them first and make sure they work.

    Folders: select name, id, id_index, display_name, description, alternate_name from grouper_stems gs where name = 'app:vpn' or name like 'app:vpn:%' or name = 'ref' or name like 'ref:%' Groups: select name, alternate_name, description, disabled_timestamp, display_name, enabled_timestamp, id, id_index, type_of_group from grouper_groups gg where gg.name like 'app:vpn:%' or gg.name like 'ref:%' Composites: SELECT gc.id, group_owner.name AS owner_name, group_left_factor.name AS left_factor_name, group_right_factor.name AS right_factor_name, gc.type FROM grouper_composites gc, grouper_groups group_owner, grouper_groups group_left_factor, grouper_groups group_right_factor WHERE gc.owner = group_owner.id AND gc.left_factor = group_left_factor.id AND gc.right_factor = group_right_factor.id and ( group_owner.name like 'app:vpn:%' or group_owner.name like 'ref:%' ) Memberships: v2.4+ SELECT gmav.immediate_membership_id AS immediate_membership_id, gg.name AS group_name, gm.subject_source AS subject_source_id, gm.subject_id, gm.subject_identifier0 AS subject_identifier, gmav.immediate_mship_disabled_time, gmav.immediate_mship_enabled_time FROM grouper_memberships_all_v gmav, grouper_members gm, grouper_groups gg, grouper_fields gf WHERE gmav.mship_type = 'immediate' AND gmav.owner_group_id = gg.id AND gmav.member_id = gm.id AND gmav.field_id = gf.id AND gf.name = 'members' and ( gg.name like 'app:vpn:%' or gg.name like 'ref:%' ) v2.3 SELECT gmav.immediate_membership_id AS immediate_membership_id, gg.name AS group_name, gm.subject_source AS subject_source_id, gm.subject_id, (select gg2.name from grouper_groups gg2 where gm.subject_source='g:gsa' and gg2.id = gm.subject_id) as subject_identifier, gmav.immediate_mship_disabled_time, gmav.immediate_mship_enabled_time FROM grouper_memberships_all_v gmav, grouper_members gm, grouper_groups gg, grouper_fields gf WHERE gmav.mship_type = 'immediate' AND gmav.owner_group_id = gg.id AND gmav.member_id = gm.id AND gmav.field_id = gf.id AND gf.name = 'members' and ( gg.name like 'app:vpn:%' or gg.name like 'ref:%' ) Group privileges: v2.4+ SELECT gmav.immediate_membership_id AS immediate_membership_id, gg.name AS group_name, gm.subject_source AS subject_source_id, gm.subject_id, gm.subject_identifier0 AS subject_identifier, gf.name as field_name FROM grouper_memberships_all_v gmav, grouper_members gm, grouper_groups gg, grouper_fields gf WHERE gmav.mship_type = 'immediate' AND gmav.immediate_mship_enabled = 'T' AND gmav.owner_group_id = gg.id AND gmav.member_id = gm.id AND gmav.field_id = gf.id AND gf.type = 'access' and ( gg.name like 'app:vpn:%' or gg.name like 'ref:%' ) v2.3 SELECT gmav.immediate_membership_id AS immediate_membership_id, gg.name AS group_name, gm.subject_source AS subject_source_id, gm.subject_id, (select gg2.name from grouper_groups gg2 where gm.subject_source='g:gsa' and gg2.id = gm.subject_id) as subject_identifier, gf.name as field_name FROM grouper_memberships_all_v gmav, grouper_members gm, grouper_groups gg, grouper_fields gf WHERE gmav.mship_type = 'immediate' AND gmav.immediate_mship_enabled = 'T' AND gmav.owner_group_id = gg.id AND gmav.member_id = gm.id AND gmav.field_id = gf.id AND gf.type = 'access' and ( gg.name like 'app:vpn:%' or gg.name like 'ref:%' ) Folder privileges: v2.4+ SELECT gmav.immediate_membership_id AS immediate_membership_id, gs.name AS stem_name, gm.subject_source AS subject_source_id, gm.subject_id, gm.subject_identifier0 AS subject_identifier, gf.name as field_name FROM grouper_memberships_all_v gmav, grouper_members gm, grouper_stems gs, grouper_fields gf WHERE gmav.mship_type = 'immediate' AND gmav.immediate_mship_enabled = 'T' AND gmav.owner_stem_id = gs.id AND gmav.member_id = gm.id AND gmav.field_id = gf.id AND gf.type = 'naming' and ( gs.name = 'app:vpn' or gs.name like 'app:vpn:%' or gs.name = 'ref' or gs.name like 'ref:%' ) v2.3 SELECT gmav.immediate_membership_id AS immediate_membership_id, gs.name AS stem_name, gm.subject_source AS subject_source_id, gm.subject_id, (select gg2.name from grouper_groups gg2 where gm.subject_source='g:gsa' and gg2.id = gm.subject_id) as subject_identifier, gf.name as field_name FROM grouper_memberships_all_v gmav, grouper_members gm, grouper_stems gs, grouper_fields gf WHERE gmav.mship_type = 'immediate' AND gmav.immediate_mship_enabled = 'T' AND gmav.owner_stem_id = gs.id AND gmav.member_id = gm.id AND gmav.field_id = gf.id AND gf.type = 'naming' and ( gs.name = 'app:vpn' or gs.name like 'app:vpn:%' or gs.name = 'ref' or gs.name like 'ref:%' )

    Sample config: grouper-loader.properties

    db.grouperTraining.url = jdbc:mysql://localhost:3306/grouper?CharSet=utf8&useUnicode=true&characterEncoding=utf8 db.grouperTraining.user = root ldap.grouperTrainingLdap.pass = password ldap.grouperTrainingLdap.searchResultHandlers = org.ldaptive.handler.DnAttributeEntryHandler,edu.internet2.middleware.grouper.ldap.ldaptive.GrouperRangeEntryHandler ldap.grouperTrainingLdap.tls = false ldap.grouperTrainingLdap.uiTestAttributeName = ou ldap.grouperTrainingLdap.uiTestExpectedValue = people ldap.grouperTrainingLdap.uiTestFilter = (ou=people) ldap.grouperTrainingLdap.uiTestSearchDn = dc=internet2,dc=edu ldap.grouperTrainingLdap.uiTestSearchScope = ONELEVEL_SCOPE ldap.grouperTrainingLdap.url = ldap://localhost:389/ ldap.grouperTrainingLdap.user = cn=root,dc=internet2,dc=edu otherJob.syncToGrouperFromTrainingDb.class = edu.internet2.middleware.grouper.app.syncToGrouper.SyncToGrouperFromSqlDaemon otherJob.syncToGrouperFromTrainingDb.quartzCron = 0 03 5 * * ? otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperAutoconfigureColumns = false otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperCompositeDeleteExtra = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperCompositeInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperCompositeSql = SELECT gc.id, group_owner.name AS owner_name, group_left_factor.name AS left_factor_name, group_right_factor.name AS right_factor_name, gc.type FROM grouper_composites gc, grouper_groups group_owner, grouper_groups group_left_factor, grouper_groups group_right_factor WHERE gc.owner = group_owner.id AND gc.left_factor = group_left_factor.id AND gc.right_factor = group_right_factor.id and ( group_owner.name like 'app:vpn:%' or group_owner.name like 'ref:%' ) otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperCompositeSync = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperCompositeSyncFieldIdOnInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperCompositeUpdate = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperDatabaseConfigId = grouperTraining otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperFromAnotherGrouper = false otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupDeleteExtra = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupSql = select name, alternate_name, description, disabled_timestamp, display_name, enabled_timestamp, id, id_index, type_of_group from grouper_groups gg where gg.name like 'app:vpn:%' or gg.name like 'ref:%' otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupSync = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupSyncFieldAlternateName = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupSyncFieldDescription = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupSyncFieldDisplayName = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupSyncFieldEnabledDisabled = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupSyncFieldIdIndexOnInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupSyncFieldIdOnInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupSyncFieldTypeOfGroup = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperGroupUpdate = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperLogOutput = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperMembershipDeleteExtra = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperMembershipInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperMembershipSql = SELECT gmav.immediate_membership_id AS immediate_membership_id, gg.name AS group_name, gm.subject_source AS subject_source_id, gm.subject_id, gm.subject_identifier0 AS subject_identifier, gmav.immediate_mship_disabled_time, gmav.immediate_mship_enabled_time FROM grouper_memberships_all_v gmav, grouper_members gm, grouper_groups gg, grouper_fields gf WHERE gmav.mship_type = 'immediate' AND gmav.owner_group_id = gg.id AND gmav.member_id = gm.id AND gmav.field_id = gf.id AND gf.name = 'members' and ( gg.name like 'app:vpn:%' or gg.name like 'ref:%' ) otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperMembershipSync = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperMembershipSyncFieldIdOnInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperMembershipSyncFieldsEnabledDisabled = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperMembershipUpdate = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeGroupDeleteExtra = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeGroupInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeGroupSql = SELECT gmav.immediate_membership_id AS immediate_membership_id, gg.name AS group_name, gm.subject_source AS subject_source_id, gm.subject_id, gm.subject_identifier0 AS subject_identifier, gf.name as field_name FROM grouper_memberships_all_v gmav, grouper_members gm, grouper_groups gg, grouper_fields gf WHERE gmav.mship_type = 'immediate' AND gmav.immediate_mship_enabled = 'T' AND gmav.owner_group_id = gg.id AND gmav.member_id = gm.id AND gmav.field_id = gf.id AND gf.type = 'access' and ( gg.name like 'app:vpn:%' or gg.name like 'ref:%' ) otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeGroupSync = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeGroupSyncFieldIdOnInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeStemDeleteExtra = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeStemInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeStemSql = SELECT gmav.immediate_membership_id AS immediate_membership_id, gs.name AS stem_name, gm.subject_source AS subject_source_id, gm.subject_id, gm.subject_identifier0 AS subject_identifier, gf.name as field_name FROM grouper_memberships_all_v gmav, grouper_members gm, grouper_stems gs, grouper_fields gf WHERE gmav.mship_type = 'immediate' AND gmav.immediate_mship_enabled = 'T' AND gmav.owner_stem_id = gs.id AND gmav.member_id = gm.id AND gmav.field_id = gf.id AND gf.type = 'naming' and ( gs.name = 'app:vpn' or gs.name like 'app:vpn:%' or gs.name = 'ref' or gs.name like 'ref:%' ) otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeStemSync = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperPrivilegeStemSyncFieldIdOnInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperReadonly = false otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemDeleteExtra = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemSql = select name, id, id_index, display_name, description, alternate_name from grouper_stems gs where name = 'app:vpn' or name like 'app:vpn:%' or name = 'ref' or name like 'ref:%' otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemSync = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemSyncFieldAlternateName = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemSyncFieldDescription = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemSyncFieldDisplayName = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemSyncFieldIdIndexOnInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemSyncFieldIdOnInsert = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperStemUpdate = true otherJob.syncToGrouperFromTrainingDb.sqlSyncToGrouperTopLevelStems = app:vpn, ref
  5. Run readonly and see report

    differences: 33 changeCount: 0 errors: 0 stemInserts: 6 groupInserts: 9 compositeInserts: 2 membershipInserts: 10 groupPrivInserts: 5 stemPrivInserts: 1 stemInsertNames: TreeSet size: 6: [0]: app:vpn [1]: app:vpn:security [2]: app:vpn:service [3]: app:vpn:service:basis [4]: app:vpn:service:policy [5]: app:vpn:service:ref groupInsertNames: TreeSet size: 9: [0]: app:vpn:security:vpn_ajohnson409_mgr [1]: app:vpn:service:basis:someBasis [2]: app:vpn:service:policy:vpn_authorized [3]: app:vpn:service:policy:vpn_authorized_allow [4]: app:vpn:service:policy:vpn_authorized_deny [5]: app:vpn:service:ref:adhocAndConsultants [6]: app:vpn:service:ref:vpn_adhoc [7]: app:vpn:service:ref:vpn_ajohnson409 [8]: app:vpn:service:ref:vpn_consultants compositeInsertNames: TreeSet size: 2: [0]: app:vpn:service:policy:vpn_authorized [1]: app:vpn:service:ref:adhocAndConsultants membershipInsertNames: TreeSet size: 10: [0]: app:vpn:security:vpn_ajohnson409_mgr - ajohnson409 [1]: app:vpn:service:basis:someBasis - dsmith789 [2]: app:vpn:service:policy:vpn_authorized_allow - app:vpn:service:ref:vpn_adhoc [3]: app:vpn:service:policy:vpn_authorized_allow - ref:faculty [4]: app:vpn:service:policy:vpn_authorized_allow - ref:staff [5]: app:vpn:service:ref:vpn_adhoc - app:vpn:service:ref:vpn_consultants [6]: app:vpn:service:ref:vpn_adhoc - ejohnson180 [7]: app:vpn:service:ref:vpn_adhoc - kdavis311 [8]: app:vpn:service:ref:vpn_ajohnson409 - bsmith458 [9]: app:vpn:service:ref:vpn_consultants - jsmith groupPrivInsertNames: TreeSet size: 5: [0]: app:vpn:service:policy:vpn_authorized - bsmith458 - readers [1]: app:vpn:service:policy:vpn_authorized - ejohnson175 - optins [2]: app:vpn:service:policy:vpn_authorized - ejohnson175 - viewers [3]: app:vpn:service:ref:vpn_ajohnson409 - app:vpn:security:vpn_ajohnson409_mgr - readers [4]: app:vpn:service:ref:vpn_ajohnson409 - app:vpn:security:vpn_ajohnson409_mgr - updaters stemPrivInsertNames: TreeSet size: 1: [0]: app:vpn:service:ref - plangenberg246 - creators



  6. Run read/write and see changes

    differences: 33 changeCount: 33 errors: 0 stemInserts: 6 groupInserts: 9 compositeInserts: 2 membershipInserts: 10 groupPrivInserts: 5 stemPrivInserts: 1 output: ArrayList size: 33: [0]: Success inserting folder 'app:vpn [1]: Success inserting folder 'app:vpn:security [2]: Success inserting folder 'app:vpn:service [3]: Success inserting folder 'app:vpn:service:basis [4]: Success inserting folder 'app:vpn:service:policy [5]: Success inserting folder 'app:vpn:service:ref [6]: Success inserting group 'app:vpn:security:vpn_ajohnson409_mgr [7]: Success inserting group 'app:vpn:service:basis:someBasis [8]: Success inserting group 'app:vpn:service:policy:vpn_authorized [9]: Success inserting group 'app:vpn:service:policy:vpn_authorized_allow [10]: Success inserting group 'app:vpn:service:policy:vpn_authorized_deny [11]: Success inserting group 'app:vpn:service:ref:adhocAndConsultants [12]: Success inserting group 'app:vpn:service:ref:vpn_adhoc [13]: Success inserting group 'app:vpn:service:ref:vpn_ajohnson409 [14]: Success inserting group 'app:vpn:service:ref:vpn_consultants [15]: Success inserting composite 'app:vpn:service:ref:adhocAndConsultants [16]: Success inserting composite 'app:vpn:service:policy:vpn_authorized [17]: Success inserting membership 'app:vpn:service:ref:vpn_consultants', 'ldap', 'jsmith' [18]: Success inserting membership 'app:vpn:service:ref:vpn_adhoc', 'g:gsa', 'app:vpn:service:ref:vpn_consultants' [19]: Success inserting membership 'app:vpn:service:ref:vpn_adhoc', 'ldap', 'ejohnson180' [20]: Success inserting membership 'app:vpn:security:vpn_ajohnson409_mgr', 'ldap', 'ajohnson409' [21]: Success inserting membership 'app:vpn:service:ref:vpn_adhoc', 'ldap', 'kdavis311' [22]: Success inserting membership 'app:vpn:service:basis:someBasis', 'ldap', 'dsmith789' [23]: Success inserting membership 'app:vpn:service:policy:vpn_authorized_allow', 'g:gsa', 'ref:staff' [24]: Success inserting membership 'app:vpn:service:policy:vpn_authorized_allow', 'g:gsa', 'ref:faculty' [25]: Success inserting membership 'app:vpn:service:policy:vpn_authorized_allow', 'g:gsa', 'app:vpn:service:ref:vpn_adhoc' [26]: Success inserting membership 'app:vpn:service:ref:vpn_ajohnson409', 'ldap', 'bsmith458' [27]: Success inserting privilege group 'app:vpn:service:ref:vpn_ajohnson409', 'g:gsa', 'app:vpn:security:vpn_ajohnson409_mgr', updaters [28]: Success inserting privilege group 'app:vpn:service:policy:vpn_authorized', 'ldap', 'ejohnson175', optins [29]: Success inserting privilege group 'app:vpn:service:policy:vpn_authorized', 'ldap', 'ejohnson175', viewers [30]: Success inserting privilege group 'app:vpn:service:ref:vpn_ajohnson409', 'g:gsa', 'app:vpn:security:vpn_ajohnson409_mgr', readers [31]: Success inserting privilege group 'app:vpn:service:policy:vpn_authorized', 'ldap', 'bsmith458', readers [32]: Success inserting privilege stem 'app:vpn:service:ref', 'ldap', 'plangenberg246', creators stemInsertNames: TreeSet size: 6: [0]: app:vpn [1]: app:vpn:security [2]: app:vpn:service [3]: app:vpn:service:basis [4]: app:vpn:service:policy [5]: app:vpn:service:ref groupInsertNames: TreeSet size: 9: [0]: app:vpn:security:vpn_ajohnson409_mgr [1]: app:vpn:service:basis:someBasis [2]: app:vpn:service:policy:vpn_authorized [3]: app:vpn:service:policy:vpn_authorized_allow [4]: app:vpn:service:policy:vpn_authorized_deny [5]: app:vpn:service:ref:adhocAndConsultants [6]: app:vpn:service:ref:vpn_adhoc [7]: app:vpn:service:ref:vpn_ajohnson409 [8]: app:vpn:service:ref:vpn_consultants compositeInsertNames: TreeSet size: 2: [0]: app:vpn:service:policy:vpn_authorized [1]: app:vpn:service:ref:adhocAndConsultants membershipInsertNames: TreeSet size: 10: [0]: app:vpn:security:vpn_ajohnson409_mgr - ajohnson409 [1]: app:vpn:service:basis:someBasis - dsmith789 [2]: app:vpn:service:policy:vpn_authorized_allow - app:vpn:service:ref:vpn_adhoc [3]: app:vpn:service:policy:vpn_authorized_allow - ref:faculty [4]: app:vpn:service:policy:vpn_authorized_allow - ref:staff [5]: app:vpn:service:ref:vpn_adhoc - app:vpn:service:ref:vpn_consultants [6]: app:vpn:service:ref:vpn_adhoc - ejohnson180 [7]: app:vpn:service:ref:vpn_adhoc - kdavis311 [8]: app:vpn:service:ref:vpn_ajohnson409 - bsmith458 [9]: app:vpn:service:ref:vpn_consultants - jsmith groupPrivInsertNames: TreeSet size: 5: [0]: app:vpn:service:policy:vpn_authorized - bsmith458 - readers [1]: app:vpn:service:policy:vpn_authorized - ejohnson175 - optins [2]: app:vpn:service:policy:vpn_authorized - ejohnson175 - viewers [3]: app:vpn:service:ref:vpn_ajohnson409 - app:vpn:security:vpn_ajohnson409_mgr - readers [4]: app:vpn:service:ref:vpn_ajohnson409 - app:vpn:security:vpn_ajohnson409_mgr - updaters stemPrivInsertNames: TreeSet size: 1: [0]: app:vpn:service:ref - plangenberg246 - creators