/********************************************************************************** * $URL:$ * $Id:$ *********************************************************************************** * * Copyright (c) 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.user.tool; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.ResourceBundle; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.component.UISelectBoolean; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; import javax.faces.event.ValueChangeEvent; import javax.faces.model.SelectItem; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.authz.api.AuthzGroup; import org.sakaiproject.api.privacy.PrivacyManager; import org.sakaiproject.tool.cover.SessionManager; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.util.ResourceLoader; public class PrivacyBean { private final String VISIBLE = "privacy_visible"; private final String HIDDEN = "privacy_hidden"; private final String HIDE = "privacy_check_hide"; private final String SHOW = "privacy_check_show"; private final String SET_SHOW_ALL_STRING = "privacy_show_all_set"; private final String SET_HIDE_ALL_STRING = "privacy_hide_all_set"; private final String SHOW_ME="Show Me"; private String checkboxText; private boolean changeStatus; private String privacyStatus; private String defaultPrivacyStatus; private Boolean displayPopup; private String selectedSite; private boolean siteSelected = false; private String curSite; private boolean allChanged = false; private String changeAllMsg; private boolean noSiteProcessErr = false; //my code private boolean updateMessage = false; private SelectItem[] sites; /** * Resource bundle messages */ ResourceLoader msgs = new ResourceLoader("user-tool-prefs"); /** Inject PrivacyManager */ private PrivacyManager privacyManager; private Log LOG = LogFactory.getLog(PrivacyBean.class); public void setPrivacyManager(PrivacyManager privacyManager) { this.privacyManager = privacyManager; } /** ========== Setters/Getters for UI ========== */ public boolean isSiteSelected() { return (isMyWorkspace()) ? siteSelected : false; } public void setSiteSelected(boolean siteSelected) { this.siteSelected = siteSelected; } public boolean getAllChanged() { return allChanged; } public void setAllChanged(boolean allChanged) { this.allChanged = allChanged; } public String getChangeAllMsg() { return changeAllMsg; } public boolean isNoSiteProcessErr() { return noSiteProcessErr; } public boolean isChangeStatus() { return changeStatus; } public void setChangeStatus(boolean changeStatus) { this.changeStatus = changeStatus; } public String getSelectedSite() { return selectedSite; } public void setSelectedSite(String selectedSite) { this.selectedSite = selectedSite; } public Boolean getDisplayPopup() { if (!isMyWorkspace()) { curSite = getContextId(); } //Display popup for when user has not made a selection AND system default is hidden if (displayPopup == null) { Boolean userMadeSelection = false; Boolean currentStatus = false; userMadeSelection = privacyManager.userMadeSelection(curSite, getUserId()); currentStatus = privacyManager.isViewable(curSite, getUserId()); displayPopup = (userMadeSelection || currentStatus ? false : true); } return displayPopup; } public String getVisibleValue() { return VISIBLE; } public String getHiddenValue() { return HIDDEN; } /** * Returns 'visible' or 'hidden' based on status within site */ public String getCurrentStatus() { if (!isMyWorkspace()) { curSite = getContextId(); } if (privacyManager.isViewable(curSite, getUserId())) { return VISIBLE;//getMessageBundleString(VISIBLE); } else { return HIDDEN;//getMessageBundleString(HIDDEN); } } public String getPrivacyStatus() { return getCurrentStatus(); } public void setPrivacyStatus(String privacyStatus) { this.privacyStatus = privacyStatus; } public String getDisplayStatus() { return getMessageBundleString(getCurrentStatus()); } /** * Return TRUE if privacy set to visible, FALSE if set to hidden */ public boolean isShow() { if (isMyWorkspace()) { return privacyManager.isViewable(curSite, getUserId()); } else { return privacyManager.isViewable(getContextId(), getUserId()); } } /** * Returns TRUE if on MyWorkspace, FALSE if on a specific site */ public boolean isMyWorkspace() { // get Site id String siteId = getContextId(); if (SiteService.getUserSiteId("admin").equals(siteId)) return false; final boolean where = SiteService.isUserSite(siteId); LOG.debug("Result of determinig if My Workspace: " + where); return where; } /** * Returns text currently displayed on checkbox */ public String getCheckboxText() { if (!isMyWorkspace()) { curSite = getContextId(); } if (privacyManager.isViewable(curSite, getUserId())) { checkboxText = getMessageBundleString(HIDE); } else { checkboxText = getMessageBundleString(SHOW); } return checkboxText; } /** * Sets the text for the checkbox */ public void setCheckboxText(String checkboxText) { this.checkboxText = checkboxText; } /** * Returns an array of SelectItem for MyWorkspace page dropdown list * @return */ public SelectItem[] getSites() { final List mySites = getSiteList(); sites = new SelectItem[mySites.toArray().length + 1]; final Iterator siteIter = mySites.iterator(); int sitesIndex = 1; sites[0] = new SelectItem("", ""); while (siteIter.hasNext()) { final Site site = (Site) siteIter.next(); sites[sitesIndex++] = new SelectItem("/site/" + site.getId(), site.getTitle()); } return sites; } /** * @return true if there are no sites for the current user OR false otherwise */ public boolean getSitesEmpty() { // getSites always adds My Workspace, so we know whether it has run or // not by checking if sites is empty; this avoids an extra query if it has. if (sites == null || sites.length == 0) { getSites(); } return (sites == null || sites.length <= 1); } /** ========== processes iteraction on UI ========== */ /** * Determines if ready to change status and calls method to do so */ public String processUpdate() { // if (isMyWorkspace() && ! siteSelected) { // noSiteProcessErr = true; // //setUpdateMessage(true); // return "main"; // } if (isMyWorkspace() && siteSelected) { if (!privacyStatus.equals("")){ processChoice(isMyWorkspace() ? curSite : getContextId(), privacyStatus.equals(HIDDEN) ? false : true); } displayPopup = false; } privacyManager.setDefaultPrivacyState(getUserId(), defaultPrivacyStatus); setUpdateMessage(true); /** // if user checked the checkbox if (changeStatus) { processChoice(isMyWorkspace() ? curSite : getContextId(), new Boolean(SHOW_ME.equals(checkboxText))); // Reset the checkbox to not checked changeStatus = false; } ***/ return "main"; } /** * Does the actual setting of the privacy status */ private void processChoice(String contextId, Boolean status) { privacyManager.setViewableState(contextId, getUserId(), status, privacyManager.USER_RECORD_TYPE); } /** * Sets the user's privacy status to Visible for all sites */ public String processShowAll() { List mySites = getSiteList(); Iterator siteIter = mySites.iterator(); while (siteIter.hasNext()) { Site curSite = (Site) siteIter.next(); processChoice("/site/" + curSite.getId(), Boolean.TRUE); } allChanged = true; changeAllMsg = getMessageBundleString(SET_SHOW_ALL_STRING); // Below so UI shows no site selected siteSelected = false; selectedSite = ""; return "main"; } /** * Sets the user's privacy status to Hidden for all sites */ public String processHideAll() { List mySites = getSiteList(); Iterator siteIter = mySites.iterator(); while (siteIter.hasNext()) { Site curSite = (Site) siteIter.next(); processChoice("/site/" + curSite.getId(), Boolean.FALSE); } allChanged = true; changeAllMsg = getMessageBundleString(SET_HIDE_ALL_STRING); // Below so UI shows no site selected siteSelected = false; selectedSite = ""; return "main"; } /** * Sets Bean variables to affect display when dropdown list * in MyWorkspace is changed. */ public void processSiteSelected(ValueChangeEvent e) { allChanged = false; noSiteProcessErr = false; if ("".equals((String) e.getNewValue())) { siteSelected = false; } else { curSite = (String) e.getNewValue(); siteSelected = true; } } /** ========== Utility functions ========== */ /** * Pulls the message from the message bundle using the name passed in * * @param key * The name in the MessageBundle for the message wanted */ private String getMessageBundleString(String key) { return msgs.getString(key); } /** * Returns a list of sites user has access to (is a member of) */ private List getSiteList() { return SiteService.getSites( org.sakaiproject.site.api.SiteService.SelectionType.ACCESS, null, null, null, org.sakaiproject.site.api.SiteService.SortType.TITLE_ASC, null); } /** * Returns context id (/site/site id) */ private String getContextId() { return "/site/" + ToolManager.getCurrentPlacement().getContext(); } /** * Returns the current user id */ public String getUserId() { return SessionManager.getCurrentSessionUserId(); } public boolean isUpdateMessage() { return updateMessage; } public void setUpdateMessage(boolean updateMessage) { this.updateMessage = updateMessage; } public String getDefaultPrivacyStatus() { if (defaultPrivacyStatus == null) { defaultPrivacyStatus = privacyManager.getDefaultPrivacyState(getUserId()); } return defaultPrivacyStatus; } public void setDefaultPrivacyStatus(String defaultPrivacyStatus) { this.defaultPrivacyStatus = defaultPrivacyStatus; } }