package org.sakaiproject.site.tool.helper.managegroupsectionrole.rsf; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.tool.helper.managegroupsectionrole.impl.ImportedGroup; import org.sakaiproject.site.tool.helper.managegroupsectionrole.impl.SiteManageGroupSectionRoleHandler; import org.sakaiproject.tool.api.SessionManager; import org.sakaiproject.tool.api.Tool; import uk.ac.cam.caret.sakai.rsf.producers.FrameAdjustingProducer; import uk.ac.cam.caret.sakai.rsf.util.SakaiURLUtil; import uk.org.ponder.messageutil.MessageLocator; 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.UIMessage; import uk.org.ponder.rsf.components.UIOutput; import uk.org.ponder.rsf.components.UIDeletionBinding; import uk.org.ponder.rsf.components.decorators.UICSSDecorator; 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.flow.jsfnav.NavigationCaseReporter; import uk.org.ponder.rsf.view.ComponentChecker; import uk.org.ponder.rsf.view.ViewComponentProducer; import uk.org.ponder.rsf.viewstate.RawViewParameters; import uk.org.ponder.rsf.viewstate.SimpleViewParameters; import uk.org.ponder.rsf.viewstate.ViewParameters; import uk.org.ponder.rsf.viewstate.ViewParamsReporter; /** * Producer for page 2 of the group import */ public class GroupImportStep2Producer implements ViewComponentProducer, NavigationCaseReporter, ViewParamsReporter, ActionResultInterceptor { private static Log M_log = LogFactory.getLog(GroupImportStep2Producer.class); public SiteManageGroupSectionRoleHandler handler; public static final String VIEW_ID = "GroupImportStep2"; public MessageLocator messageLocator; public FrameAdjustingProducer frameAdjustingProducer; public SessionManager sessionManager; public String getViewID() { return VIEW_ID; } public void fillComponents(UIContainer tofill, ViewParameters viewParams, ComponentChecker checker) { GroupImportViewParameters params = (GroupImportViewParameters) viewParams; UIBranchContainer content = UIBranchContainer.make(tofill, "content:"); List<ImportedGroup> importedGroups = handler.getImportedGroups(); boolean badData = false; //get list of groups already in this site List<Group> existingGroups = handler.getGroups(); //print each group for(ImportedGroup importedGroup: importedGroups) { UIBranchContainer branch = UIBranchContainer.make(content,"groups:", importedGroup.getGroupTitle()); boolean groupExists = false; Group existingGroup = null; //add title UIOutput.make(branch,"title",importedGroup.getGroupTitle()); //check if group already exists for(Group g : existingGroups) { if(StringUtils.equals(g.getTitle(), importedGroup.getGroupTitle())) { existingGroup = g; groupExists = true; UIOutput.make(branch,"groupexistsmsg:",messageLocator.getMessage("import2.groupexists")); } } //if group already exists, get the users that are already in the group, //merge so we get one list, then display the new or merged ones appropriately. Set<String> userIds = importedGroup.getUserIds(); List<String> existingUserIds = new ArrayList<String>(); if(groupExists) { existingUserIds = handler.getGroupUserIds(existingGroup); userIds.addAll(existingUserIds); } //print each user for(String userId: importedGroup.getUserIds()) { UIOutput output = UIOutput.make(branch,"member:",userId); //check user is valid if(handler.isValidSiteUser(userId)){ //is user existing? if(existingUserIds.contains(userId)) { //highlight grey Map<String,String> cssMap = new HashMap<String,String>(); cssMap.put("color","grey"); output.decorate(new UICSSDecorator(cssMap)); } } else { badData = true; //highlight red Map<String,String> cssMap = new HashMap<String,String>(); cssMap.put("color","red"); output.decorate(new UICSSDecorator(cssMap)); } } } UIForm createForm = UIForm.make(content, "form"); if(badData) { UIMessage.make(content, "import2.error", "import2.error"); handler.resetParams(); UICommand cancel = UICommand.make(createForm, "cancel", messageLocator.getMessage("cancel"), "#{SiteManageGroupSectionRoleHandler.processCancel}"); cancel.parameters.add(new UIDeletionBinding("#{destroyScope.resultScope}")); } else { UIMessage.make(content, "import2.okay", "import2.okay"); UICommand.make(createForm, "continue", messageLocator.getMessage("import2.continue"), "#{SiteManageGroupSectionRoleHandler.processImportedGroups}"); UICommand cancel = UICommand.make(createForm, "cancel", messageLocator.getMessage("cancel"), "#{SiteManageGroupSectionRoleHandler.processCancel}"); cancel.parameters.add(new UIDeletionBinding("#{destroyScope.resultScope}")); } if(StringUtils.equals(params.status, "error")){ UIMessage.make(content, "import2.couldntimportgroups", "import2.couldntimportgroups"); } frameAdjustingProducer.fillComponents(tofill, "resize", "resetFrame"); } public List<NavigationCase> reportNavigationCases() { List<NavigationCase> togo = new ArrayList<NavigationCase>(); togo.add(new NavigationCase("success", new SimpleViewParameters(GroupListProducer.VIEW_ID))); togo.add(new NavigationCase("error", new GroupImportViewParameters(GroupImportStep2Producer.VIEW_ID, "error"))); return togo; } public void interceptActionResult(ARIResult result, ViewParameters incoming, Object actionReturn) { if ("done".equals(actionReturn)) { handler.resetParams(); Tool tool = handler.getCurrentTool(); result.resultingView = new RawViewParameters(SakaiURLUtil.getHelperDoneURL(tool, sessionManager)); } } public ViewParameters getViewParameters() { return new GroupImportViewParameters(); } }