public void testAttributeDefSave() { // cant create without privs GrouperSession.stopQuietly(this.grouperSession); this.grouperSession = GrouperSession.start(SubjectTestHelper.SUBJ0); try { new AttributeDefSave(this.grouperSession).assignName("top:b").save(); fail("shouldnt get here"); } catch (Exception e) { // good } // grant privs GrouperSession.stopQuietly(this.grouperSession); this.grouperSession = GrouperSession.startRootSession(); this.top.grantPriv(SubjectTestHelper.SUBJ0, NamingPrivilege.CREATE); AttributeDefSave attributeDefSave = new AttributeDefSave(this.grouperSession).assignName("top:b"); AttributeDef attributeDef = attributeDefSave.save(); assertEquals("top:b", attributeDef.getName()); assertNull(attributeDef.getDescription()); assertFalse(attributeDef.isMultiValued()); assertEquals(SaveResultType.INSERT, attributeDefSave.getSaveResultType()); // update attributeDefSave = new AttributeDefSave(this.grouperSession) .assignName("top:b") .assignDescription("whatever") .assignValueType(AttributeDefValueType.string) .assignMultiValued(true); attributeDef = attributeDefSave.save(); assertEquals(SaveResultType.UPDATE, attributeDefSave.getSaveResultType()); assertEquals("whatever", attributeDef.getDescription()); assertTrue(attributeDef.isMultiValued()); // no change attributeDefSave = new AttributeDefSave(this.grouperSession) .assignName("top:b") .assignDescription("whatever") .assignValueType(AttributeDefValueType.string) .assignMultiValued(true); attributeDef = attributeDefSave.save(); assertEquals(SaveResultType.NO_CHANGE, attributeDefSave.getSaveResultType()); assertEquals("whatever", attributeDef.getDescription()); assertTrue(attributeDef.isMultiValued()); }
/** edit the enabled disabled */ @SuppressWarnings("unchecked") public void memberMenuEnabledDisabled() { GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); // lets see which subject we are dealing with: HttpServletRequest httpServletRequest = GrouperUiFilter.retrieveHttpServletRequest(); String menuIdOfMenuTarget = httpServletRequest.getParameter("menuIdOfMenuTarget"); if (StringUtils.isBlank(menuIdOfMenuTarget)) { throw new RuntimeException("Missing id of menu target"); } if (!menuIdOfMenuTarget.startsWith("memberMenuButton_")) { throw new RuntimeException("Invalid id of menu target: '" + menuIdOfMenuTarget + "'"); } String memberId = GrouperUtil.prefixOrSuffix(menuIdOfMenuTarget, "memberMenuButton_", false); final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); GrouperSession grouperSession = null; Group group = null; try { grouperSession = GrouperSession.start(loggedInSubject); Member member = MemberFinder.findByUuid(grouperSession, memberId, true); group = new SimpleMembershipUpdate().retrieveGroup(grouperSession); Membership membership = group.getImmediateMembership(Group.getDefaultList(), member, false, true); SimpleMembershipUpdateContainer simpleMembershipUpdateContainer = SimpleMembershipUpdateContainer.retrieveFromSession(); GuiMember guiMember = new GuiMember(member); simpleMembershipUpdateContainer.setEnabledDisabledMember(guiMember); guiMember.setMembership(membership); guiResponseJs.addAction( GuiScreenAction.newDialogFromJsp( "/WEB-INF/grouperUi/templates/simpleMembershipUpdate/simpleMembershipUpdateEnabledDisabled.jsp")); } catch (ControllerDone cd) { throw cd; } catch (NoSessionException nse) { throw nse; } catch (Exception se) { throw new RuntimeException( "Error listing member details: " + menuIdOfMenuTarget + ", " + se.getMessage(), se); } finally { GrouperSession.stopQuietly(grouperSession); } }
/** * Creates a group if it does not exist, removes all its members otherwise . * * @param definition The definition of the group. * @see * org.esco.dynamicgroups.dao.grouper.IGroupsDAOService#resetGroupMembers(DynamicGroupDefinition) */ public void resetGroupMembers(final DynamicGroupDefinition definition) { GrouperSession session = null; try { session = GrouperSession.start(SubjectFinder.findRootSubject(), false); GrouperSession.callbackGrouperSession( session, new ResetGroupMembersCallback(this, definition.getGroupUUID())); } catch (SessionException e) { LOGGER.error(e, e); } finally { GrouperSession.stopQuietly(session); } }
/** * handle a click or select from the member menu * * @param httpServletRequest * @param httpServletResponse */ @SuppressWarnings("unused") public void memberMenu( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); GrouperSession grouperSession = null; Group group = null; try { grouperSession = GrouperSession.start(loggedInSubject); // make sure we are on the right group group = new SimpleMembershipUpdate().retrieveGroup(grouperSession); } catch (NoSessionException se) { throw se; } catch (ControllerDone cd) { throw cd; } catch (Exception se) { throw new RuntimeException("Error member menu: " + group + ", " + se.getMessage(), se); } finally { GrouperSession.stopQuietly(grouperSession); } String menuItemId = httpServletRequest.getParameter("menuItemId"); String menuHtmlId = httpServletRequest.getParameter("menuHtmlId"); // String menuRadioGroup = httpServletRequest.getParameter("menuRadioGroup"); // String menuCheckboxChecked = httpServletRequest.getParameter("menuCheckboxChecked"); menuHtmlId = httpServletRequest.getParameter("menuIdOfMenuTarget"); if (StringUtils.equals(menuItemId, "memberDetails")) { // guiResponseJs.addAction(GuiScreenAction.newAlert("Menu action: menuItemId: " + // menuItemId // + ", menuHtmlId: " + menuHtmlId)); this.memberMenuSubjectDetails(); } else if (StringUtils.equals(menuItemId, "enabledDisabled")) { this.memberMenuEnabledDisabled(); } else { throw new RuntimeException("Unexpected menu id: '" + menuItemId + "'"); } }
/** * handle a click or select from the advanced menu * * @param httpServletRequest * @param httpServletResponse */ public void advancedMenu( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); GrouperSession grouperSession = null; Group group = null; try { grouperSession = GrouperSession.start(loggedInSubject); // make sure we are on the right group group = new SimpleMembershipUpdate().retrieveGroup(grouperSession); } catch (NoSessionException se) { throw se; } catch (ControllerDone cd) { throw cd; } catch (Exception se) { throw new RuntimeException("Error advanced menu: " + group + ", " + se.getMessage(), se); } finally { GrouperSession.stopQuietly(grouperSession); } String menuItemId = httpServletRequest.getParameter("menuItemId"); String menuEvent = httpServletRequest.getParameter("menuEvent"); boolean isOnClick = StringUtils.equals("onClick", menuEvent); // String menuHtmlId = httpServletRequest.getParameter("menuHtmlId"); // String menuRadioGroup = httpServletRequest.getParameter("menuRadioGroup"); String menuCheckboxChecked = httpServletRequest.getParameter("menuCheckboxChecked"); // guiResponseJs.addAction(GuiScreenAction.newAlert("Menu action: menuItemId: " + menuItemId // + ", menuHtmlId: " + menuHtmlId // + ", menuRadioGroup: " // + menuRadioGroup + ", menuCheckboxChecked: " + menuCheckboxChecked)); if (StringUtils.equals(menuItemId, "inviteLink")) { guiResponseJs.addAction( GuiScreenAction.newScript( "window.location = 'grouper.html?operation=InviteExternalSubjects.inviteExternalSubject&groupId=" + group.getUuid() + "'")); } else if (StringUtils.equals(menuItemId, "showGroupDetails")) { if (!isOnClick) { if (GrouperUtil.booleanValue(menuCheckboxChecked)) { guiResponseJs.addAction( GuiScreenAction.newHideShowNameToShow("simpleMembershipUpdateGroupDetails")); } else { guiResponseJs.addAction( GuiScreenAction.newHideShowNameToHide("simpleMembershipUpdateGroupDetails")); } } } else if (StringUtils.equals(menuItemId, "multiDelete")) { if (!isOnClick) { if (GrouperUtil.booleanValue(menuCheckboxChecked)) { guiResponseJs.addAction( GuiScreenAction.newHideShowNameToShow("simpleMembershipUpdateDeleteMultiple")); } else { guiResponseJs.addAction( GuiScreenAction.newHideShowNameToHide("simpleMembershipUpdateDeleteMultiple")); } } } else if (StringUtils.equals(menuItemId, "showMemberFilter")) { if (!isOnClick) { if (GrouperUtil.booleanValue(menuCheckboxChecked)) { guiResponseJs.addAction( GuiScreenAction.newHideShowNameToShow("simpleMembershipUpdateMemberFilter")); } else { guiResponseJs.addAction( GuiScreenAction.newHideShowNameToHide("simpleMembershipUpdateMemberFilter")); } } } else if (StringUtils.equals(menuItemId, "exportSubjectIds")) { guiResponseJs.addAction( GuiScreenAction.newAlertFromJsp( "/WEB-INF/grouperUi/templates/simpleMembershipUpdate/simpleMembershipUpdateExportSubjectIds.jsp")); } else if (StringUtils.equals(menuItemId, "exportAll")) { guiResponseJs.addAction( GuiScreenAction.newAlertFromJsp( "/WEB-INF/grouperUi/templates/simpleMembershipUpdate/simpleMembershipUpdateExportAll.jsp")); } else if (StringUtils.equals(menuItemId, "import")) { guiResponseJs.addAction( GuiScreenAction.newDialogFromJsp( "/WEB-INF/grouperUi/templates/simpleMembershipUpdate/simpleMembershipUpdateImport.jsp")); } else { throw new RuntimeException("Unexpected menu id: '" + menuItemId + "'"); } }
/** show subject details */ @SuppressWarnings("unchecked") public void memberMenuSubjectDetails() { GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); // lets see which subject we are dealing with: HttpServletRequest httpServletRequest = GrouperUiFilter.retrieveHttpServletRequest(); String menuIdOfMenuTarget = httpServletRequest.getParameter("menuIdOfMenuTarget"); if (StringUtils.isBlank(menuIdOfMenuTarget)) { throw new RuntimeException("Missing id of menu target"); } if (!menuIdOfMenuTarget.startsWith("memberMenuButton_")) { throw new RuntimeException("Invalid id of menu target: '" + menuIdOfMenuTarget + "'"); } String memberId = GrouperUtil.prefixOrSuffix(menuIdOfMenuTarget, "memberMenuButton_", false); final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); GrouperSession grouperSession = null; try { grouperSession = GrouperSession.start(loggedInSubject); Member member = MemberFinder.findByUuid(grouperSession, memberId, true); Subject subject = member.getSubject(); String order = null; try { order = GrouperUiConfig.retrieveConfig() .propertyValueString("subject.attributes.order." + subject.getSource().getId()); } catch (MissingResourceException mre) { // thats ok, go with default } if (StringUtils.isBlank(order)) { Set<String> attributeNames = new LinkedHashSet<String>(); attributeNames.add("screenLabel"); attributeNames.addAll(GrouperUtil.nonNull(subject.getAttributes()).keySet()); // lets add subjectId, typeName, sourceId, sourceName, memberId attributeNames.add("subjectId"); attributeNames.add("name"); attributeNames.add("description"); attributeNames.add("typeName"); attributeNames.add("sourceId"); attributeNames.add("sourceName"); order = GrouperUtil.join(attributeNames.iterator(), ','); } String[] attrNames = GrouperUtil.splitTrim(order, ","); SimpleMembershipUpdateContainer simpleMembershipUpdateContainer = SimpleMembershipUpdateContainer.retrieveFromSession(); simpleMembershipUpdateContainer.setSubjectForDetails(subject); simpleMembershipUpdateContainer.getSubjectDetails().clear(); // lookup each attribute for (String attrName : attrNames) { // sometimes group have blank attributes??? if (StringUtils.isBlank(attrName)) { continue; } String attributeValue = GuiSubject.attributeValue(subject, attrName); simpleMembershipUpdateContainer.getSubjectDetails().put(attrName, attributeValue); } guiResponseJs.addAction( GuiScreenAction.newAlertFromJsp( "/WEB-INF/grouperUi/templates/simpleMembershipUpdate/simpleMembershipUpdateSubjectDetails.jsp")); } catch (ControllerDone cd) { throw cd; } catch (NoSessionException nse) { throw nse; } catch (Exception se) { throw new RuntimeException( "Error listing member details: " + menuIdOfMenuTarget + ", " + se.getMessage(), se); } finally { GrouperSession.stopQuietly(grouperSession); } }
/** * make the structure of the advanced menu * * @param httpServletRequest * @param httpServletResponse */ public void advancedMenuStructure( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { // get the text to add to html if showing details GuiHideShow showGroupDetails = GuiHideShow.retrieveHideShow("simpleMembershipUpdateGroupDetails", true); // get the text to add to html if showing multi delete GuiHideShow showMultiDelete = GuiHideShow.retrieveHideShow("simpleMembershipUpdateDeleteMultiple", true); // get the text to add to html if showing member filter GuiHideShow showMemberFilter = GuiHideShow.retrieveHideShow("simpleMembershipUpdateMemberFilter", true); SimpleMembershipUpdateContainer simpleMembershipUpdateContainer = SimpleMembershipUpdateContainer.retrieveFromSession(); DhtmlxMenu dhtmlxMenu = new DhtmlxMenu(); final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); Group group = null; GrouperSession grouperSession = null; boolean canInviteOthers = false; try { grouperSession = GrouperSession.start(loggedInSubject); group = new SimpleMembershipUpdate().retrieveGroup(grouperSession); UIGroupPrivilegeResolver resolver = UIGroupPrivilegeResolverFactory.getInstance( grouperSession, GrouperUiFilter.retrieveSessionMediaResourceBundle(), group, grouperSession.getSubject()); canInviteOthers = resolver.canInviteExternalPeople(); } finally { GrouperSession.stopQuietly(grouperSession); } { DhtmlxMenuItem multiDeleteMenuItem = new DhtmlxMenuItem(); multiDeleteMenuItem.setId("multiDelete"); multiDeleteMenuItem.setType("checkbox"); if (showMultiDelete.isShowing()) { multiDeleteMenuItem.setChecked(showMultiDelete.isShowing()); } multiDeleteMenuItem.setText( simpleMembershipUpdateContainer.getText().getAdvancedMenuDeleteMultiple()); multiDeleteMenuItem.setTooltip( simpleMembershipUpdateContainer.getText().getAdvancedMenuDeleteMultipleTooltip()); dhtmlxMenu.addDhtmlxItem(multiDeleteMenuItem); } { // see if we can invite if (canInviteOthers && GrouperUiConfig.retrieveConfig() .propertyValueBoolean("inviteExternalPeople.link-from-lite-ui", false)) { DhtmlxMenuItem memberInviteMenuItem = new DhtmlxMenuItem(); memberInviteMenuItem.setId("inviteLink"); memberInviteMenuItem.setText(TagUtils.navResourceString("ui-lite.invite-menu")); memberInviteMenuItem.setTooltip(TagUtils.navResourceString("ui-lite.invite-menuTooltip")); // memberInviteMenuItem.setHref("grouper.html?operation=InviteExternalSubjects.inviteExternalSubject&groupId=" + group.getUuid()); // memberInviteMenuItem.setHref("http://localhost:8091/grouper/grouperUi/appHtml/grouper.html?operation=InviteExternalSubjects.inviteExternalSubject&groupId=0e0262d9be924774914052c12f0e7fd2"); dhtmlxMenu.addDhtmlxItem(memberInviteMenuItem); } } { DhtmlxMenuItem groupDetailsMenuItem = new DhtmlxMenuItem(); groupDetailsMenuItem.setId("showGroupDetails"); groupDetailsMenuItem.setType("checkbox"); if (showGroupDetails.isShowing()) { groupDetailsMenuItem.setChecked(showGroupDetails.isShowing()); } groupDetailsMenuItem.setText( simpleMembershipUpdateContainer.getText().getAdvancedMenuShowGroupDetails()); groupDetailsMenuItem.setTooltip( simpleMembershipUpdateContainer.getText().getAdvancedMenuShowGroupDetailsTooltip()); dhtmlxMenu.addDhtmlxItem(groupDetailsMenuItem); } { DhtmlxMenuItem memberFilterMenuItem = new DhtmlxMenuItem(); memberFilterMenuItem.setId("showMemberFilter"); memberFilterMenuItem.setType("checkbox"); if (showMemberFilter.isShowing()) { memberFilterMenuItem.setChecked(showMemberFilter.isShowing()); } memberFilterMenuItem.setText( simpleMembershipUpdateContainer.getText().getAdvancedMenuShowMemberFilter()); memberFilterMenuItem.setTooltip( simpleMembershipUpdateContainer.getText().getAdvancedMenuShowMemberFilterTooltip()); dhtmlxMenu.addDhtmlxItem(memberFilterMenuItem); } DhtmlxMenuItem importExportMenuItem = new DhtmlxMenuItem(); importExportMenuItem.setId("importExport"); importExportMenuItem.setText( simpleMembershipUpdateContainer.getText().getAdvancedMenuImportExport()); importExportMenuItem.setTooltip( simpleMembershipUpdateContainer.getText().getAdvancedMenuImportExportTooltip()); dhtmlxMenu.addDhtmlxItem(importExportMenuItem); DhtmlxMenuItem exportMenuItem = new DhtmlxMenuItem(); exportMenuItem.setId("export"); exportMenuItem.setText(simpleMembershipUpdateContainer.getText().getAdvancedMenuExport()); exportMenuItem.setTooltip( simpleMembershipUpdateContainer.getText().getAdvancedMenuExportTooltip()); importExportMenuItem.addDhtmlxItem(exportMenuItem); { DhtmlxMenuItem exportSubjectIdsMenuItem = new DhtmlxMenuItem(); exportSubjectIdsMenuItem.setId("exportSubjectIds"); exportSubjectIdsMenuItem.setText( simpleMembershipUpdateContainer.getText().getAdvancedMenuExportSubjectIds()); exportSubjectIdsMenuItem.setTooltip( simpleMembershipUpdateContainer.getText().getAdvancedMenuExportSubjectIdsTooltip()); exportMenuItem.addDhtmlxItem(exportSubjectIdsMenuItem); } { DhtmlxMenuItem exportAllMenuItem = new DhtmlxMenuItem(); exportAllMenuItem.setId("exportAll"); exportAllMenuItem.setText( simpleMembershipUpdateContainer.getText().getAdvancedMenuExportAll()); exportAllMenuItem.setTooltip( simpleMembershipUpdateContainer.getText().getAdvancedMenuExportAllTooltip()); exportMenuItem.addDhtmlxItem(exportAllMenuItem); } { DhtmlxMenuItem importMenuItem = new DhtmlxMenuItem(); importMenuItem.setId("import"); importMenuItem.setText(simpleMembershipUpdateContainer.getText().getAdvancedMenuImport()); importMenuItem.setTooltip( simpleMembershipUpdateContainer.getText().getAdvancedMenuImportTooltip()); importExportMenuItem.addDhtmlxItem(importMenuItem); } GrouperUiUtils.printToScreen( "<?xml version=\"1.0\"?>\n" + dhtmlxMenu.toXml(), HttpContentType.TEXT_XML, false, false); throw new ControllerDone(); }
/** * @see * edu.internet2.middleware.grouper.changeLog.ChangeLogConsumerBase#processChangeLogEntries(java.util.List, * edu.internet2.middleware.grouper.changeLog.ChangeLogProcessorMetadata) */ @Override public long processChangeLogEntries( List<ChangeLogEntry> changeLogEntryList, ChangeLogProcessorMetadata changeLogProcessorMetadata) { long currentId = -1; boolean startedGrouperSession = false; GrouperSession grouperSession = GrouperSession.staticGrouperSession(false); if (grouperSession == null) { grouperSession = GrouperSession.startRootSession(); startedGrouperSession = true; } else { grouperSession = grouperSession.internal_getRootSession(); } // try catch so we can track that we made some progress try { for (ChangeLogEntry changeLogEntry : changeLogEntryList) { currentId = changeLogEntry.getSequenceNumber(); // if this is a group add action and category if (changeLogEntry.equalsCategoryAndAction(ChangeLogTypeBuiltin.GROUP_ADD)) { String groupName = changeLogEntry.retrieveValueForLabel(ChangeLogLabels.GROUP_ADD.name); if (GrouperDuoUtils.validDuoGroupName(groupName)) { String groupExtension = GrouperUtil.extensionFromName(groupName); // get the group in grouper String groupDescription = changeLogEntry.retrieveValueForLabel(ChangeLogLabels.GROUP_ADD.description); // shouldnt be the case but check anyways if (!GrouperDuoCommands.retrieveGroups().containsKey(groupExtension)) { GrouperDuoCommands.createDuoGroup(groupExtension, groupDescription, true); } } } else if (changeLogEntry.equalsCategoryAndAction(ChangeLogTypeBuiltin.GROUP_DELETE)) { String groupName = changeLogEntry.retrieveValueForLabel(ChangeLogLabels.GROUP_DELETE.name); if (GrouperDuoUtils.validDuoGroupName(groupName)) { String groupExtension = GrouperUtil.extensionFromName(groupName); // shouldnt be the case but check anyways GrouperDuoGroup grouperDuoGroup = GrouperDuoCommands.retrieveGroups().get(groupExtension); if (grouperDuoGroup != null) { GrouperDuoCommands.deleteDuoGroup(grouperDuoGroup.getId(), true); } } } if (changeLogEntry.equalsCategoryAndAction(ChangeLogTypeBuiltin.GROUP_UPDATE)) { String groupName = changeLogEntry.retrieveValueForLabel(ChangeLogLabels.GROUP_UPDATE.name); if (GrouperDuoUtils.validDuoGroupName(groupName)) { String groupExtension = GrouperUtil.extensionFromName(groupName); // get the group in grouper Group group = GroupFinder.findByName(grouperSession, groupName, false); if (group != null) { // shouldnt be the case but check anyways Map<String, GrouperDuoGroup> groupNameToDuoGroupMap = GrouperDuoCommands.retrieveGroups(); GrouperDuoGroup grouperDuoGroup = groupNameToDuoGroupMap.get(groupExtension); if (grouperDuoGroup != null) { GrouperDuoCommands.updateDuoGroup( grouperDuoGroup.getId(), group.getDescription(), true); } } } } boolean isMembershipAdd = changeLogEntry.equalsCategoryAndAction(ChangeLogTypeBuiltin.MEMBERSHIP_ADD); boolean isMembershipDelete = changeLogEntry.equalsCategoryAndAction(ChangeLogTypeBuiltin.MEMBERSHIP_DELETE); boolean isMembershipUpdate = changeLogEntry.equalsCategoryAndAction(ChangeLogTypeBuiltin.MEMBERSHIP_UPDATE); if (isMembershipAdd || isMembershipDelete || isMembershipUpdate) { String groupName = changeLogEntry.retrieveValueForLabel(ChangeLogLabels.MEMBERSHIP_ADD.groupName); if (GrouperDuoUtils.validDuoGroupName(groupName)) { String sourceId = changeLogEntry.retrieveValueForLabel(ChangeLogLabels.MEMBERSHIP_ADD.sourceId); boolean inCorrectSubjectSource = GrouperDuoUtils.configSourcesForSubjects().contains(sourceId); if (inCorrectSubjectSource) { String groupExtension = GrouperUtil.extensionFromName(groupName); Group group = GroupFinder.findByName(grouperSession, groupName, false); Map<String, GrouperDuoGroup> groupNameToDuoGroupMap = GrouperDuoCommands.retrieveGroups(); GrouperDuoGroup grouperDuoGroup = groupNameToDuoGroupMap.get(groupExtension); String subjectId = changeLogEntry.retrieveValueForLabel(ChangeLogLabels.MEMBERSHIP_ADD.subjectId); String subjectAttributeForDuoUsername = GrouperDuoUtils.configSubjectAttributeForDuoUsername(); String username = null; Subject subject = SubjectFinder.findByIdAndSource(subjectId, sourceId, false); if (StringUtils.equals("id", subjectAttributeForDuoUsername)) { username = subjectId; } else { if (subject != null) { String attributeValue = subject.getAttributeValue(subjectAttributeForDuoUsername); if (!StringUtils.isBlank(attributeValue)) { username = attributeValue; } } } String duoGroupId = grouperDuoGroup != null ? grouperDuoGroup.getId() : null; String duoUserId = !StringUtils.isBlank(username) ? GrouperDuoCommands.retrieveUserIdFromUsername(username) : null; // cant do anything if missing these things if (!StringUtils.isBlank(duoGroupId) && !StringUtils.isBlank(duoUserId)) { boolean userInDuoGroup = GrouperDuoCommands.userInGroup(duoUserId, duoGroupId, true); boolean addUserToGroup = isMembershipAdd; // if update it could have unexpired if (isMembershipUpdate && group != null && subject != null && group.hasMember(subject)) { addUserToGroup = true; } // see if any update is needed if (addUserToGroup != userInDuoGroup) { if (addUserToGroup) { GrouperDuoCommands.assignUserToGroup(duoUserId, duoGroupId, true); } else { GrouperDuoCommands.removeUserFromGroup(duoUserId, duoGroupId, true); } } } } } } // we successfully processed this record } } catch (Exception e) { changeLogProcessorMetadata.registerProblem(e, "Error processing record", currentId); // we made it to this -1 return currentId - 1; } finally { if (startedGrouperSession) { GrouperSession.stopQuietly(grouperSession); } } if (currentId == -1) { throw new RuntimeException("Couldnt process any records"); } return currentId; }