package org.sakaiproject.site.tool.helper.managegroup.rsf;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.site.api.Group;
import org.sakaiproject.site.tool.helper.managegroup.impl.SiteManageGroupHandler;
import org.sakaiproject.authz.api.AuthzGroup;
import org.sakaiproject.authz.api.AuthzGroupService;
import org.sakaiproject.authz.api.GroupNotDefinedException;
import org.sakaiproject.authz.api.Member;
import org.sakaiproject.tool.api.SessionManager;
import org.sakaiproject.tool.api.Tool;
import org.sakaiproject.user.api.User;
import org.sakaiproject.user.api.UserDirectoryService;
import org.sakaiproject.util.Validator;
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.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.UIInternalLink;
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.UISelectChoice;
import uk.org.ponder.rsf.components.decorators.DecoratorList;
import uk.org.ponder.rsf.components.decorators.UILabelTargetDecorator;
import uk.org.ponder.rsf.components.decorators.UITooltipDecorator;
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.DefaultView;
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.stringutil.StringList;
/**
*
* @author Dr. WHO?
*
*/
public class GroupListProducer
implements ViewComponentProducer, ActionResultInterceptor, DefaultView {
/** Our log (commons). */
private static Log M_log = LogFactory.getLog(GroupListProducer.class);
public static final String VIEW_ID = "GroupList";
public Map siteGroups;
public SiteManageGroupHandler handler;
public MessageLocator messageLocator;
public SessionManager sessionManager;
public FrameAdjustingProducer frameAdjustingProducer;
public String getViewID() {
return VIEW_ID;
}
private UserDirectoryService userDirectoryService;
public void setUserDirectoryService(UserDirectoryService userDirectoryService)
{
this.userDirectoryService = userDirectoryService;
}
private AuthzGroupService authzGroupService;
public void setAuthzGroupService(AuthzGroupService authzGroupService)
{
this.authzGroupService = authzGroupService;
}
private TargettedMessageList tml;
public void setTargettedMessageList(TargettedMessageList tml) {
this.tml = tml;
}
public void fillComponents(UIContainer tofill, ViewParameters viewparams,
ComponentChecker checker) {
UIBranchContainer actions = UIBranchContainer.make(tofill,"actions:",Integer.toString(0));
UIInternalLink.make(actions,"add",UIMessage.make("group.newgroup"), new GroupEditViewParameters(GroupEditProducer.VIEW_ID, null));
UIOutput.make(tofill, "group-list-title", messageLocator.getMessage("group.list"));
UIForm deleteForm = UIForm.make(tofill, "delete-group-form");
List<Group> groups = null;
groups = handler.getGroups();
if (groups != null && groups.size() > 0)
{
StringList deletable = new StringList();
M_log.debug(this + "fillComponents: got a list of " + groups.size() + " groups");
// Create a multiple selection control for the tasks to be deleted.
// We will fill in the options at the loop end once we have collected them.
UISelect deleteselect = UISelect.makeMultiple(deleteForm, "delete-group",
null, "#{SiteManageGroupHandler.deleteGroupIds}", new String[] {});
//get the headers for the table
UIMessage.make(deleteForm, "group-title-title","group.title");
UIMessage.make(deleteForm, "group-size-title", "group.number");
UIMessage.make(deleteForm, "group-remove-title", "editgroup.remove");
for (Iterator<Group> it=groups.iterator(); it.hasNext(); ) {
Group group = it.next();
String groupId = group.getId();
UIBranchContainer grouprow = UIBranchContainer.make(deleteForm, "group-row:", group.getId());
String groupTitle = Validator.escapeHtml(group.getTitle());
UIOutput.make(grouprow, "group-title-label", groupTitle);
UIInput name =
UIInput.make(grouprow, "group-name-input", "#{SitegroupEditHandler.nil}", groupTitle);
UIOutput nameLabel =
UIOutput.make(grouprow, "group-name-label", messageLocator.getMessage("group.title"));
nameLabel.decorate(new UILabelTargetDecorator(name));
UIOutput.make(grouprow,"group-title", groupTitle);
int size = 0;
try
{
AuthzGroup g = authzGroupService.getAuthzGroup(group.getReference());
Collection<Member> gMembers = g != null ? g.getMembers():new Vector<Member>();
size = gMembers.size();
if (size > 0)
{
for (Iterator<Member> gItr=gMembers.iterator(); gItr.hasNext();){
Member p = (Member) gItr.next();
// exclude those user with provided roles and rosters
String userId = p.getUserId();
try
{
User u = userDirectoryService.getUser(userId);
}
catch (Exception e)
{
M_log.debug(this + "fillInComponent: cannot find user with id " + userId);
// need to remove the group member
size--;
}
}
}
}
catch (GroupNotDefinedException e)
{
M_log.debug(this + "fillComponent: cannot find group " + group.getReference());
}
UIOutput.make(grouprow,"group-size",String.valueOf(size));
UIInternalLink editLink = UIInternalLink.make(grouprow,"group-revise",messageLocator.getMessage("editgroup.revise"),
new GroupEditViewParameters(GroupEditProducer.VIEW_ID, groupId));
editLink.decorators = new DecoratorList(new UITooltipDecorator(messageLocator.getMessage("group.sorttitleasc")+ ":" + groupTitle));
deletable.add(group.getId());
UISelectChoice delete = UISelectChoice.make(grouprow, "group-select", deleteselect.getFullID(), (deletable.size()-1));
delete.decorators = new DecoratorList(new UITooltipDecorator(UIMessage.make("delete_group_tooltip", new String[] {groupTitle})));
UIMessage message = UIMessage.make(grouprow,"delete-label","delete_group_tooltip", new String[] {groupTitle});
UILabelTargetDecorator.targetLabel(message,delete);
}
deleteselect.optionlist.setValue(deletable.toStringArray());
UICommand.make(deleteForm, "delete-groups", UIMessage.make("editgroup.removechecked"), "#{SiteManageGroupHandler.processConfirmGroupDelete}");
UICommand.make(deleteForm, "cancel", UIMessage.make("editgroup.cancel"), "#{SiteManageGroupHandler.processCancel}");
}
else
{
UIMessage.make(deleteForm, "no-group","group.nogroup");
UICommand.make(deleteForm, "cancel", UIMessage.make("editgroup.cancel"), "#{SiteManageGroupHandler.processCancel}");
}
//process any messages
tml = handler.messages;
if (tml.size() > 0) {
for (int i = 0; i < tml.size(); i ++ ) {
UIBranchContainer errorRow = UIBranchContainer.make(tofill,"error-row:", Integer.valueOf(i).toString());
String outString = "";
if (tml.messageAt(i).args != null ) {
outString = messageLocator.getMessage(tml.messageAt(i).acquireMessageCode(),tml.messageAt(i).args[0]);
} else {
outString = messageLocator.getMessage(tml.messageAt(i).acquireMessageCode());
}
UIMessage.make(errorRow,"error",outString);
}
}
}
// old and busted
// public List reportNavigationCases() {
// Tool tool = handler.getCurrentTool();
// List togo = new ArrayList();
// togo.add(new NavigationCase("confirm", new SimpleViewParameters(GroupDelProducer.VIEW_ID)));
// togo.add(new NavigationCase("done",
// new RawViewParameters(SakaiURLUtil.getHelperDoneURL(tool, sessionManager))));
// return togo;
// }
// new hotness
public void interceptActionResult(ARIResult result, ViewParameters incoming, Object actionReturn) {
if ("confirm".equals(actionReturn)) {
result.resultingView = new SimpleViewParameters(GroupDelProducer.VIEW_ID);
} else if ("done".equals(actionReturn)) {
Tool tool = handler.getCurrentTool();
result.resultingView = new RawViewParameters(SakaiURLUtil.getHelperDoneURL(tool, sessionManager));
}
}
}