package org.sakaiproject.site.tool.helper.managegroupsectionrole.rsf; import java.util.Collection; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.authz.api.Member; import org.sakaiproject.authz.api.Role; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.api.SiteService; import org.sakaiproject.site.tool.helper.managegroupsectionrole.impl.SiteManageGroupSectionRoleHandler; import org.sakaiproject.site.util.Participant; import org.sakaiproject.site.util.SiteComparator; import org.sakaiproject.site.util.SiteConstants; import org.sakaiproject.util.SortedIterator; import org.sakaiproject.util.SortedIterator; import org.sakaiproject.user.api.User; import org.sakaiproject.user.api.UserDirectoryService; import uk.ac.cam.caret.sakai.rsf.producers.FrameAdjustingProducer; import uk.org.ponder.messageutil.MessageLocator; import uk.org.ponder.messageutil.TargettedMessage; import uk.org.ponder.messageutil.TargettedMessageList; import uk.org.ponder.rsf.components.UIBoundBoolean; import uk.org.ponder.rsf.components.UIBranchContainer; import uk.org.ponder.rsf.components.UIContainer; import uk.org.ponder.rsf.components.UIInput; import uk.org.ponder.rsf.components.UIMessage; import uk.org.ponder.rsf.components.UIOutput; import uk.org.ponder.rsf.components.UICommand; import uk.org.ponder.rsf.components.UIForm; import uk.org.ponder.rsf.components.UISelect; import uk.org.ponder.rsf.components.UIDeletionBinding; import uk.org.ponder.rsf.components.decorators.UICSSDecorator; import uk.org.ponder.rsf.components.decorators.UILabelTargetDecorator; import uk.org.ponder.rsf.components.decorators.UITooltipDecorator; import uk.org.ponder.rsf.evolvers.FormatAwareDateInputEvolver; import uk.org.ponder.rsf.flow.ARIResult; import uk.org.ponder.rsf.flow.ActionResultInterceptor; import uk.org.ponder.rsf.flow.jsfnav.NavigationCase; import uk.org.ponder.rsf.view.ComponentChecker; import uk.org.ponder.rsf.view.ViewComponentProducer; import uk.org.ponder.rsf.viewstate.SimpleViewParameters; import uk.org.ponder.rsf.viewstate.ViewParameters; import uk.org.ponder.rsf.viewstate.ViewParamsReporter; import uk.org.ponder.stringutil.StringList; /** * * @author * */ public class GroupEditProducer implements ViewComponentProducer, ActionResultInterceptor, ViewParamsReporter{ /** Our log (commons). */ private static Log M_log = LogFactory.getLog(GroupEditProducer.class); private String SECTION_PREFIX = "Section: "; private String ROLE_PREFIX = "Role: "; public SiteManageGroupSectionRoleHandler handler; public static final String VIEW_ID = "GroupEdit"; public MessageLocator messageLocator; public FrameAdjustingProducer frameAdjustingProducer; public SiteService siteService = null; public String getViewID() { return VIEW_ID; } private TargettedMessageList tml; public void setTargettedMessageList(TargettedMessageList tml) { this.tml = tml; } public UserDirectoryService userDirectoryService; public void setUserDirectoryService(UserDirectoryService userDirectoryService) { this.userDirectoryService = userDirectoryService; } public void fillComponents(UIContainer arg0, ViewParameters arg1, ComponentChecker arg2) { String state=""; // group Group g = null; // id for group String groupId = null; // title for group String groupTitle = null; // description for group String groupDescription = null; // member list for group Collection<Member> groupMembers = new Vector<Member>(); // group provider id String groupProviderId = null; // list of group role provider ids List<String> groupRoleProviderRoles = null; UIForm groupForm = UIForm.make(arg0, "groups-form"); String id = ((GroupEditViewParameters) arg1).id; if (id != null) { try { g = siteService.findGroup(id); groupId = g.getId(); groupTitle = g.getTitle(); groupDescription = g.getDescription(); groupMembers = g.getMembers(); groupProviderId = g.getProviderGroupId(); groupRoleProviderRoles = handler.getGroupProviderRoles(g); String joinableSet = g.getProperties().getProperty(g.GROUP_PROP_JOINABLE_SET); if(joinableSet != null && !"".equals(joinableSet.trim())){ handler.joinableSetName = joinableSet; handler.joinableSetNameOrig = joinableSet; handler.joinableSetNumOfMembers = g.getProperties().getProperty(g.GROUP_PROP_JOINABLE_SET_MAX); handler.allowViewMembership = Boolean.valueOf(g.getProperties().getProperty(g.GROUP_PROP_JOINABLE_SET_PREVIEW)); }else{ handler.joinableSetName = ""; handler.joinableSetNameOrig = ""; handler.joinableSetNumOfMembers = ""; handler.allowViewMembership = false; } } catch (Exception e) { M_log.debug(this + "fillComponents: cannot get group id=" + id); } } else { handler.resetParams(); } // action button name: Add for adding new group, Update for editing exist group String addUpdateButtonName = id != null?messageLocator.getMessage("editgroup.update"):messageLocator.getMessage("editgroup.new"); UIOutput.make(groupForm, "prompt", messageLocator.getMessage("group.newgroup")); UIOutput.make(groupForm, "emptyGroupTitleAlert", messageLocator.getMessage("editgroup.titlemissing")); UIOutput.make(groupForm, "instructions", messageLocator.getMessage("editgroup.instruction", new Object[]{addUpdateButtonName})); UIOutput.make(groupForm, "group_title_label", messageLocator.getMessage("group.title")); UIInput titleTextIn = UIInput.make(groupForm, "group_title", "#{SiteManageGroupSectionRoleHandler.title}",groupTitle); UIMessage groupDescrLabel = UIMessage.make(groupForm, "group_description_label", "group.description"); UIInput groupDescr = UIInput.make(groupForm, "group_description", "#{SiteManageGroupSectionRoleHandler.description}", groupDescription); UILabelTargetDecorator.targetLabel(groupDescrLabel, groupDescr); //Joinable Set: UIMessage joinableSetLabel = UIMessage.make(groupForm, "group_joinable_set_label", "group.joinable.set"); Set<String> joinableSets = new HashSet<String>(); joinableSets.add(""); for(Group group : handler.site.getGroups()){ String joinableSet = group.getProperties().getProperty(group.GROUP_PROP_JOINABLE_SET); if(joinableSet != null){ joinableSets.add(joinableSet); } } String[] joinableSetsArr = joinableSets.toArray(new String[joinableSets.size()]); UISelect joinableSetSelect = UISelect.make(groupForm, "joinable-set", joinableSetsArr, joinableSetsArr, "SiteManageGroupSectionRoleHandler.joinableSetName"); UILabelTargetDecorator.targetLabel(joinableSetLabel, joinableSetSelect); //joinable div: UIBranchContainer joinableDiv = UIBranchContainer.make(groupForm, "joinable-set-div:"); if(handler.joinableSetName == null || "".equals(handler.joinableSetName)){ Map<String, String> hidden = new HashMap<String, String>(); hidden.put("display", "none"); joinableDiv.decorate(new UICSSDecorator(hidden)); } //Max members Row: UIMessage.make(joinableDiv, "group-max-members", "group.joinable.maxMembers2"); UIInput.make(joinableDiv, "num-max-members", "SiteManageGroupSectionRoleHandler.joinableSetNumOfMembers"); //allow preview row: UIBoundBoolean checkbox = UIBoundBoolean.make(joinableDiv, "allowViewMembership", "#{SiteManageGroupSectionRoleHandler.allowViewMembership}"); UILabelTargetDecorator.targetLabel(UIMessage.make(joinableDiv, "allowViewMembership-label", "group.joinable.allowPreview"), checkbox); UIOutput.make(groupForm, "membership_label", messageLocator.getMessage("editgroup.membership")); UIOutput.make(groupForm, "membership_site_label", messageLocator.getMessage("editgroup.generallist")); UIOutput.make(groupForm, "membership_group_label", messageLocator.getMessage("editgroup.grouplist")); /********************** for the site members list **************************/ List<String> siteRosters= handler.getSiteRosters(g); List<Role> siteRoles= handler.getSiteRoles(g); List<Participant> siteMembers= handler.getSiteParticipant(g); int totalListSize = siteRosters.size() + siteRoles.size() + siteMembers.size(); String[] siteMemberLabels = new String[totalListSize]; String[] siteMemberValues = new String[totalListSize]; UISelect siteMember = UISelect.makeMultiple(groupForm,"siteMembers",siteMemberValues,siteMemberLabels,"#{SiteManageGroupSectionRoleHandler.selectedSiteMembers}", new String[] {}); int i =0; // add site roster for (String roster:siteRosters) { // not include in the group yet if (groupProviderId == null || !groupProviderId.contains(roster)) { siteMemberLabels[i] = SECTION_PREFIX + roster; siteMemberValues[i] = roster; i++; } } // add site role for (Role role:siteRoles) { // not include in the group yet if (groupRoleProviderRoles == null || !groupRoleProviderRoles.contains(role.getId())) { siteMemberLabels[i] = ROLE_PREFIX + role.getId(); siteMemberValues[i] = role.getId(); i++; } } // add site members to the list Iterator<Participant> sIterator = new SortedIterator(siteMembers.iterator(), new SiteComparator(SiteConstants.SORTED_BY_PARTICIPANT_NAME, Boolean.TRUE.toString())); for (; sIterator.hasNext();i++){ Participant p = (Participant) sIterator.next(); // not in the group yet if (g == null || g.getMember(p.getUniqname()) == null) { siteMemberLabels[i] = p.getName() + " (" + p.getDisplayId() + ")"; siteMemberValues[i] = p.getUniqname(); } } /********************** for the group members list **************************/ // rosters List<String> groupRosters = handler.getGroupRosters(g); if (groupRosters != null) { totalListSize = groupRosters.size(); } // roles List<String> groupProviderRoles = handler.getGroupProviderRoles(g); if (groupProviderRoles != null) { totalListSize += groupProviderRoles.size(); } // group members List<Member> groupMembersCopy = new Vector<Member>(); groupMembersCopy.addAll(groupMembers); for (Iterator<Member> gItr=groupMembersCopy.iterator(); gItr.hasNext();){ Member p = (Member) gItr.next(); // exclude those user with provided roles and rosters String userId = p.getUserId(); try{ // get user User u = userDirectoryService.getUser(userId); if (handler.isUserFromProvider(u.getEid(), userId, g, groupRosters, groupProviderRoles)) { groupMembers.remove(p); } } catch (Exception e) { M_log.debug(this + "fillInComponent: cannot find user with id " + userId); // need to remove the group member groupMembers.remove(p); } } if (groupMembers != null) { totalListSize +=groupMembers.size(); } String[] groupMemberLabels = new String[totalListSize]; String[] groupMemberValues = new String[totalListSize]; UISelect groupMember = UISelect.make(groupForm,"groupMembers",groupMemberValues,groupMemberLabels,null); i =0; // add the rosters first if (groupRosters != null) { for (String groupRoster:groupRosters) { groupMemberLabels[i] = SECTION_PREFIX + groupRoster; groupMemberValues[i] = groupRoster; i++; } } // add the roles next if (groupProviderRoles != null) { for (String groupProviderRole:groupProviderRoles) { groupMemberLabels[i] = ROLE_PREFIX + groupProviderRole; groupMemberValues[i] = groupProviderRole; i++; } } // add the members last if (groupMembers != null) { Iterator<Member> gIterator = new SortedIterator(groupMembers.iterator(), new SiteComparator(SiteConstants.SORTED_BY_MEMBER_NAME, Boolean.TRUE.toString())); for (; gIterator.hasNext();i++){ Member p = (Member) gIterator.next(); String userId = p.getUserId(); try { User u = userDirectoryService.getUser(userId); groupMemberLabels[i] = u.getSortName() + " (" + u.getDisplayId() + ")"; } catch (Exception e) { M_log.debug(this + ":fillComponents: cannot find user " + userId); } groupMemberValues[i] = userId; } } UICommand.make(groupForm, "save", addUpdateButtonName, "#{SiteManageGroupSectionRoleHandler.processAddGroup}"); UICommand cancel = UICommand.make(groupForm, "cancel", messageLocator.getMessage("editgroup.cancel"), "#{SiteManageGroupSectionRoleHandler.processBack}"); cancel.parameters.add(new UIDeletionBinding("#{destroyScope.resultScope}")); UIInput.make(groupForm, "newRight", "#{SiteManageGroupSectionRoleHandler.memberList}", state); // hidden field for group id UIInput.make(groupForm, "groupId", "#{SiteManageGroupSectionRoleHandler.id}", groupId); //process any messages tml = handler.messages; if (tml.size() > 0) { for (i = 0; i < tml.size(); i ++ ) { UIBranchContainer errorRow = UIBranchContainer.make(arg0,"error-row:", Integer.valueOf(i).toString()); TargettedMessage msg = tml.messageAt(i); if (msg.args != null ) { UIMessage.make(errorRow,"error", msg.acquireMessageCode(), (Object[]) msg.args); } else { UIMessage.make(errorRow,"error", msg.acquireMessageCode()); } } } frameAdjustingProducer.fillComponents(arg0, "resize", "resetFrame"); } public ViewParameters getViewParameters() { GroupEditViewParameters params = new GroupEditViewParameters(); params.id = null; return params; } // new hotness public void interceptActionResult(ARIResult result, ViewParameters incoming, Object actionReturn) { if ("success".equals(actionReturn) || "cancel".equals(actionReturn)) { result.resultingView = new SimpleViewParameters(GroupListProducer.VIEW_ID); } } }