package org.sakaiproject.site.tool.helper.managegroup.rsf; import java.util.Collection; import java.util.Iterator; import java.util.List; 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.site.api.Group; import org.sakaiproject.site.api.SiteService; import org.sakaiproject.site.tool.helper.managegroup.impl.SiteManageGroupHandler; import org.sakaiproject.site.util.Participant; import org.sakaiproject.site.util.SiteComparator; import org.sakaiproject.site.util.SiteConstants; import org.sakaiproject.user.api.User; import org.sakaiproject.user.api.UserDirectoryService; import org.sakaiproject.util.SortedIterator; 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.UIBranchContainer; import uk.org.ponder.rsf.components.UICommand; import uk.org.ponder.rsf.components.UIContainer; import uk.org.ponder.rsf.components.UIForm; 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.UISelect; import uk.org.ponder.rsf.components.decorators.UILabelTargetDecorator; import uk.org.ponder.rsf.flow.ARIResult; import uk.org.ponder.rsf.flow.ActionResultInterceptor; 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; /** * * @author Dr. WHO? * */ public class GroupEditProducer implements ViewComponentProducer, ActionResultInterceptor, ViewParamsReporter { /** Our log (commons). */ private static Log M_log = LogFactory.getLog(GroupEditProducer.class); public SiteManageGroupHandler 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>(); 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(); } 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", "#{SiteManageGroupHandler.title}",groupTitle); UIMessage groupDescrLabel = UIMessage.make(arg0, "group_description_label", "group.description"); UIInput groupDescr = UIInput.make(groupForm, "group_description", "#{SiteManageGroupHandler.description}", groupDescription); UILabelTargetDecorator.targetLabel(groupDescrLabel, groupDescr); 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 Collection siteMembers= handler.getSiteParticipant(g); String[] siteMemberLabels = new String[siteMembers.size()]; String[] siteMemberValues = new String[siteMembers.size()]; UISelect siteMember = UISelect.makeMultiple(groupForm,"siteMembers",siteMemberValues,siteMemberLabels,"#{SiteManageGroupHandler.selectedSiteMembers}", new String[] {}); int i =0; 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 String[] groupMemberLabels = new String[groupMembers.size()]; String[] groupMemberValues = new String[groupMembers.size()]; UISelect groupMember = UISelect.make(groupForm,"groupMembers",groupMemberValues,groupMemberLabels,null); i =0; 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); // need to remove the group member groupMembers.remove(p); } groupMemberValues[i] = userId; } UICommand.make(groupForm, "save", addUpdateButtonName, "#{SiteManageGroupHandler.processAddGroup}"); UICommand.make(groupForm, "cancel", messageLocator.getMessage("editgroup.cancel"), "#{SiteManageGroupHandler.processBack}"); UIInput.make(groupForm, "newRight", "#{SiteManageGroupHandler.memberList}", state); // hidden field for group id UIInput.make(groupForm, "groupId", "#{SiteManageGroupHandler.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; } // old and busted // public List reportNavigationCases() { // List togo = new ArrayList(); // togo.add(new NavigationCase("success", new SimpleViewParameters(GroupListProducer.VIEW_ID))); // togo.add(new NavigationCase("cancel", new SimpleViewParameters(GroupListProducer.VIEW_ID))); // return togo; // } // 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); } } }