/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/roster/trunk/roster-app/src/java/org/sakaiproject/tool/roster/BaseRosterPageBean.java $ * $Id: BaseRosterPageBean.java 127027 2013-07-15 14:30:46Z david.horwitz@uct.ac.za $ *********************************************************************************** * * Copyright (c) 2007, 2008 The Sakai Foundation * * 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.tool.roster; import java.text.Collator; import java.text.ParseException; import java.text.RuleBasedCollator; import java.text.DateFormat; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import javax.faces.event.ActionEvent; import org.sakaiproject.api.app.roster.Participant; import org.sakaiproject.api.app.roster.RosterFunctions; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.entity.api.Entity; import org.sakaiproject.tool.cover.ToolManager; public abstract class BaseRosterPageBean { public static final String ROSTER_VIEW_EMAIL = "roster_view_email"; public abstract String getPageTitle(); public abstract boolean isExportablePage(); public abstract void export(ActionEvent event); // Static comparators public static final Comparator<Participant> sortNameComparator; public static final Comparator<Participant> displayIdComparator; public static final Comparator<Participant> emailComparator; public static final Comparator<Participant> roleComparator; static { sortNameComparator = new Comparator<Participant>() { Collator r_collator; { r_collator = Collator.getInstance(); try { r_collator = new RuleBasedCollator(((RuleBasedCollator)Collator.getInstance()).getRules().replaceAll("<'\u005f'", "<' '<'\u005f'")); } catch(ParseException e) { } } public int compare(Participant one, Participant another) { int comparison = 0; comparison = r_collator.compare(one.getUser().getSortName(),another.getUser().getSortName()); return comparison == 0 ? displayIdComparator.compare(one, another) : comparison; } }; displayIdComparator = new Comparator<Participant>() { Collator r_collator; { r_collator = Collator.getInstance(); try { r_collator = new RuleBasedCollator(((RuleBasedCollator)Collator.getInstance()).getRules().replaceAll("<'\u005f'", "<' '<'\u005f'")); } catch(ParseException e) { } } public int compare(Participant one, Participant another) { return r_collator.compare(one.getUser().getDisplayId(),another.getUser().getDisplayId()); } }; emailComparator = new Comparator<Participant>() { public int compare(Participant one, Participant another) { String email1 = one.getUser().getEmail(); String email2 = another.getUser().getEmail(); if(email1 != null && email2 == null) { return 1; } if(email1 == null && email2 != null) { return -1; } if(email1 == null && email2 == null) { return sortNameComparator.compare(one, another); } int comparison = Collator.getInstance().compare(one.getUser().getEmail(), another.getUser().getEmail()); return comparison == 0 ? sortNameComparator.compare(one, another) : comparison; } }; roleComparator = new Comparator<Participant>() { Collator r_collator; { r_collator = Collator.getInstance(); try { r_collator = new RuleBasedCollator(((RuleBasedCollator)Collator.getInstance()).getRules().replaceAll("<'\u005f'", "<' '<'\u005f'")); } catch(ParseException e) { } } public int compare(Participant one, Participant another) { int comparison = 0; comparison = r_collator.compare(one.getRoleTitle(),another.getRoleTitle()); return comparison == 0 ? sortNameComparator.compare(one, another) : comparison; } }; } // Service & Bean References protected FilteredParticipantListingBean filter; public FilteredParticipantListingBean getFilter() { return filter; } public void setFilter(FilteredParticipantListingBean filter) { this.filter = filter; } protected RosterPreferences prefs; public void setPrefs(RosterPreferences prefs) { this.prefs = prefs; } // Utility methods protected String getSiteReference() { return filter.services.siteService.siteReference(getSiteContext()); } protected String getSiteContext() { return filter.services.toolManager.getCurrentPlacement().getContext(); } public List<Participant> getParticipants() { List<Participant> participants = filter.getParticipants(); if (participants != null && participants.size() >= 1) { Collections.sort(participants, getComparator()); if(!prefs.sortAscending) { Collections.reverse(participants); } } return participants; } protected Comparator<Participant> getComparator() { String sortColumn = prefs.getSortColumn(); Comparator<Participant> comparator; if (Participant.SORT_BY_ID.equals(sortColumn)) { comparator = displayIdComparator; } else if (Participant.SORT_BY_EMAIL.equals(sortColumn)) { comparator = emailComparator; } else if(Participant.SORT_BY_ROLE.equals(sortColumn)) { comparator = roleComparator; } else if(Participant.SORT_BY_NAME.equals(sortColumn)) { comparator = sortNameComparator; } else { // Default to the sort name comparator = sortNameComparator; } return comparator; } // UI logic protected Boolean renderOfficialPhotos; protected Boolean renderStatusLink; protected Boolean renderPicturesLink; protected Boolean renderProfileLinks; protected Boolean renderGroupMembershipLink; public boolean isRenderStatusLink() { if(renderStatusLink == null) { renderStatusLink = filter.services.securityService.unlock( RosterFunctions.ROSTER_FUNCTION_VIEWENROLLMENTSTATUS, getSiteReference()) && ! filter.statusRequestCache().enrollmentSets.isEmpty(); } return renderStatusLink.booleanValue(); } public boolean isRenderPicturesLink() { if(renderPicturesLink == null) { renderPicturesLink = filter.services.rosterManager.isOfficialPhotosViewable() || filter.services.rosterManager.isProfilesViewable(); } return renderPicturesLink.booleanValue(); } public boolean isRenderProfileLinks() { if(renderProfileLinks == null) { renderProfileLinks = filter.services.rosterManager.isProfilesViewable(); } return renderProfileLinks.booleanValue(); } public boolean isRenderGroupMembershipLink() { if(renderGroupMembershipLink == null) { renderGroupMembershipLink = filter.services.rosterManager.isGroupMembershipViewable(); } return renderGroupMembershipLink.booleanValue(); } public boolean isOfficialPhotosAvailableToCurrentUser() { if(renderOfficialPhotos == null) { renderOfficialPhotos = filter.services.rosterManager.isOfficialPhotosViewable(); } return renderOfficialPhotos.booleanValue(); } public String getPrintFriendlyUrl() { return ServerConfigurationService.getToolUrl() + Entity.SEPARATOR + ToolManager.getCurrentPlacement().getId() + Entity.SEPARATOR + "printFriendly"; } /** * Some institutions use an email address as a user's displayId. For these institutions, * we provide a way to hide the email column. */ public boolean isEmailColumnRendered() { return Boolean.TRUE.toString().equalsIgnoreCase( filter.services.serverConfigurationService.getString(ROSTER_VIEW_EMAIL, "true")); } protected String getDownloadFileName(String rawString) { String dateString = DateFormat.getDateInstance(DateFormat.SHORT).format(new Date()); return (rawString + "_" + dateString).replaceAll("[\\W&&[^\\u0080-\\uffff]]", "_"); } public String groupMembership() { // clears section filter for the group membership page filter.sectionFilter = null; return "groupMembership"; } }