/************************************************************************************ * * Author: Stephen Kane, steve.kane@rutgers.edu * * Copyright (c) 2013 Rutgers, the State University of New Jersey * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.lessonbuildertool.tool.producers; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.text.SimpleDateFormat; import java.text.DateFormat; import java.util.Calendar; import java.util.Set; import org.sakaiproject.lessonbuildertool.SimplePageComment; import org.sakaiproject.lessonbuildertool.SimplePageItem; import org.sakaiproject.lessonbuildertool.SimplePage; import org.sakaiproject.lessonbuildertool.SimplePageLogEntry; import org.sakaiproject.lessonbuildertool.SimpleStudentPage; import org.sakaiproject.lessonbuildertool.model.SimplePageToolDao; import org.sakaiproject.lessonbuildertool.tool.beans.SimplePageBean; import org.sakaiproject.lessonbuildertool.tool.view.PeerEvalStatsViewParameters; import org.sakaiproject.lessonbuildertool.tool.view.GeneralViewParameters; import org.sakaiproject.lessonbuildertool.SimplePagePeerEvalResult; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.site.api.Group; import org.sakaiproject.user.api.User; import org.sakaiproject.user.cover.UserDirectoryService; import org.sakaiproject.time.cover.TimeService; import org.sakaiproject.util.ResourceLoader; import org.sakaiproject.authz.cover.SecurityService; import uk.org.ponder.messageutil.MessageLocator; import uk.org.ponder.localeutil.LocaleGetter; import uk.org.ponder.rsf.components.UIBranchContainer; import uk.org.ponder.rsf.components.UIContainer; import uk.org.ponder.rsf.components.UIInternalLink; import uk.org.ponder.rsf.components.UIOutput; import uk.org.ponder.rsf.components.UIVerbatim; import uk.org.ponder.rsf.components.decorators.UIFreeAttributeDecorator; import uk.org.ponder.rsf.components.decorators.UIStyleDecorator; 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.SimpleViewParameters; import uk.org.ponder.rsf.viewstate.ViewParameters; import uk.org.ponder.rsf.viewstate.ViewParamsReporter; public class PeerEvalStatsProducer implements ViewComponentProducer, ViewParamsReporter, NavigationCaseReporter { public static final String VIEW_ID = "PeerEvalStats"; private SimplePageBean simplePageBean; private ShowPageProducer showPageProducer; private MessageLocator messageLocator; private LocaleGetter localeGetter; private SimplePageToolDao simplePageToolDao; private HashMap<String, String> anonymousLookup = new HashMap<String, String>(); private HashMap<Long, String> itemToPageowner = null; private String currentUserId; private String owner = null; private boolean canEditPage = false; Locale M_locale = null; DateFormat df = null; DateFormat dfTime = null; DateFormat dfDate = null; public String getViewID() { return VIEW_ID; } UIBranchContainer studentInfo; public void fillComponents(UIContainer tofill, ViewParameters viewparams, ComponentChecker checker) { PeerEvalStatsViewParameters params = (PeerEvalStatsViewParameters) viewparams; try { simplePageBean.updatePageObject(params.getSendingPage(), false); } catch (Exception e) { System.out.println("PeerEval permission exception " + e); return; } canEditPage = simplePageBean.canEditPage(); if(!canEditPage || params.getSendingPage() == -1) return; UIOutput.make(tofill, "html").decorate(new UIFreeAttributeDecorator("lang", localeGetter.get().getLanguage())) .decorate(new UIFreeAttributeDecorator("xml:lang", localeGetter.get().getLanguage())); Set<String> users; Site site = null; try { site = SiteService.getSite(ToolManager.getCurrentPlacement().getContext()); users = site.getUsers(); } catch (Exception impossible) { System.out.println("Can't find site/users - PeerEvalStatsProducer.java"); return; } UIOutput.make(tofill, "expand-collapse"); UIOutput.make(tofill, "expand-all", messageLocator.getMessage("simplepage.expand-all")); UIOutput.make(tofill, "collapse-all",messageLocator.getMessage("simplepage.collapse-all")); try { long studentContentBoxId = params.getItemId(); SimplePageItem item = simplePageToolDao.findItem(studentContentBoxId); makePeerRubric(tofill,item); List<SimpleStudentPage> studentPages = simplePageToolDao.findStudentPages(studentContentBoxId); Collections.sort(studentPages, new Comparator<SimpleStudentPage>() { public int compare(SimpleStudentPage o1, SimpleStudentPage o2) { String title1 = o1.getTitle(); if (title1 == null) title1 = ""; String title2 = o2.getTitle(); if (title2 == null) title2 = ""; return title1.compareTo(title2); } }); for(SimpleStudentPage page : studentPages) { if(page.isDeleted()) continue; studentInfo = UIBranchContainer.make(tofill, "peer-eval-gradee-branch:"); UIOutput.make(studentInfo, "user-name", ""+UserDirectoryService.getUser(page.getOwner()).getDisplayName()); UIOutput.make(studentInfo, "user-id", ""+page.getOwner()); //remove user from non-participant user list if(users != null) users.remove(page.getOwner()); UIOutput.make(studentInfo, "user-pageid", ""+page.getPageId()); ArrayList<PeerEvaluation> graders = getGraders(page.getPageId(), page.getOwner()); makeGraders(studentInfo, graders); } GeneralViewParameters view = new GeneralViewParameters(); view.viewID = ShowPageProducer.VIEW_ID; view.setItemId(studentContentBoxId); //returns to page that contains the student content box item. UIInternalLink.make(tofill, "back", messageLocator.getMessage("simplepage.back"), view); // users is now set of users in site without page // remove any who are instructor or reviewer String ref = "/site/" + site.getId(); for (String userId: users) { if (SecurityService.unlock(userId, SimplePage.PERMISSION_LESSONBUILDER_UPDATE, ref) || SecurityService.unlock(userId, SimplePage.PERMISSION_LESSONBUILDER_SEE_ALL, ref)) users.remove(userId); } //make inactive user list if(!users.isEmpty()){ UIBranchContainer inactiveMemberBranch; UIOutput.make(tofill, "inactive-member-collection"); for(String userId : users){ inactiveMemberBranch = UIBranchContainer.make(tofill, "inactive-member:"); UIOutput.make(inactiveMemberBranch, "inactive-member-id", userId); UIOutput.make(inactiveMemberBranch, "inactive-member-name", UserDirectoryService.getUser(userId).getDisplayName()); } } } catch (Exception e) { e.printStackTrace(); System.out.println("peer eval error " + e); }; } public void setShowPageProducer(ShowPageProducer showPageProducer) { this.showPageProducer = showPageProducer; } public void setSimplePageBean(SimplePageBean bean) { simplePageBean = bean; } public void setMessageLocator(MessageLocator locator) { messageLocator = locator; } public void setLocaleGetter(LocaleGetter getter) { localeGetter = getter; } public void setSimplePageToolDao(SimplePageToolDao simplePageToolDao) { this.simplePageToolDao = simplePageToolDao; } public ViewParameters getViewParameters() { return new PeerEvalStatsViewParameters(); } private void makePeerRubric(UIContainer parent, SimplePageItem i) { class RubricRow implements Comparable{ public int id; public String text; public RubricRow(int id, String text){ this.id=id; this.text=text;} public int compareTo(Object o){ RubricRow r = (RubricRow)o; if(id==r.id) return 0; if(id>r.id) return 1; return -1; } } UIOutput.make(parent, "peer-eval-rubric"); ArrayList<RubricRow> rows = new ArrayList<RubricRow>(); List categories = (List) i.getJsonAttribute("rows"); if(categories != null){ for(Object o: categories){ Map cat = (Map)o; rows.add(new RubricRow(Integer.parseInt(String.valueOf(cat.get("id"))), String.valueOf(cat.get("rowText")))); } } //else{System.out.println("This rubric has no rows.");} Collections.sort(rows); for(RubricRow row : rows){ UIBranchContainer peerReviewRows = UIBranchContainer.make(parent, "peer-eval-row:"); UIOutput.make(peerReviewRows, "peer-eval-text", row.text); } } private ArrayList<PeerEvaluation> getGraders(Long pageId, String owner){ ArrayList<PeerEvaluation> myEvaluations = new ArrayList<PeerEvaluation>(); List<SimplePagePeerEvalResult> evaluations = simplePageToolDao.findPeerEvalResultByOwner(pageId, owner); if(evaluations!=null && evaluations.size()!=0) for(SimplePagePeerEvalResult eval : evaluations){ PeerEvaluation target=new PeerEvaluation(eval.getRowText(), eval.getColumnValue()); int targetIndex=myEvaluations.indexOf(target); if(targetIndex!=-1){ try{ myEvaluations.get(targetIndex).addGrader(UserDirectoryService.getUser(eval.getGrader()).getDisplayName(), eval.getGrader()); }catch(Exception e){ myEvaluations.get(targetIndex).addGrader("User not found.","none"); } } else{ try{ target.addGrader(UserDirectoryService.getUser(eval.getGrader()).getDisplayName(), eval.getGrader()); myEvaluations.add(target); }catch(Exception e){ target.addGrader("User not found.","none"); myEvaluations.add(target); } } } //else // System.out.println("evaluations is empty/null;"); return myEvaluations; } public void makeGraders(UIContainer parent, ArrayList<PeerEvaluation> myEvaluations){ if(!myEvaluations.isEmpty()) for(PeerEvaluation eval: myEvaluations){ UIBranchContainer evalData = UIBranchContainer.make(parent, "peer-eval-data-grade:"); UIOutput.make(evalData, "peer-eval-row-text", eval.category); UIOutput.make(evalData, "peer-eval-grade", String.valueOf(eval.grade)); for(int i = 0; i < eval.graderNames.size() ; i++){ String graderName=eval.graderNames.get(i); String graderId=eval.graderIds.get(i); UIBranchContainer graderBranch = UIBranchContainer.make(evalData, "peer-eval-grader-branch:"); UIOutput.make(graderBranch, "peer-eval-grader-name", graderName); UIOutput.make(graderBranch, "peer-eval-grader-id", graderId); } UIOutput.make(evalData, "peer-eval-count", ""+eval.graderNames.size()); } } public List reportNavigationCases() { List<NavigationCase> togo = new ArrayList<NavigationCase>(); togo.add(new NavigationCase(null, new SimpleViewParameters(ShowPageProducer.VIEW_ID))); togo.add(new NavigationCase("success", new SimpleViewParameters(ShowPageProducer.VIEW_ID))); togo.add(new NavigationCase("cancel", new SimpleViewParameters(ShowPageProducer.VIEW_ID))); return togo; } class PeerEvaluation{ String category; public int grade; public ArrayList<String> graderNames; public ArrayList<String> graderIds; public PeerEvaluation(String category, int grade){ this.category=category;this.grade=grade; graderNames=new ArrayList<String>(); graderIds=new ArrayList<String>(); } public void addGrader(String graderName, String graderId){graderNames.add(graderName);graderIds.add(graderId);} public boolean equals(Object o){ if ( !(o instanceof PeerEvaluation) ) return false; PeerEvaluation pe = (PeerEvaluation)o; return category.equals(pe.category) && grade==pe.grade; } public String toString(){return category + " " + grade + " [ + arraylist of graders + ]";} } }