Mercurial > hg > LGDataverses
diff src/main/java/edu/harvard/iq/dataverse/DataverseHeaderFragment.java @ 10:a50cf11e5178
Rewrite LGDataverse completely upgrading to dataverse4.0
| author | Zoe Hong <zhong@mpiwg-berlin.mpg.de> |
|---|---|
| date | Tue, 08 Sep 2015 17:00:21 +0200 |
| parents | |
| children | c2e2d794847f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseHeaderFragment.java Tue Sep 08 17:00:21 2015 +0200 @@ -0,0 +1,282 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package edu.harvard.iq.dataverse; + +import edu.harvard.iq.dataverse.authorization.Permission; +import edu.harvard.iq.dataverse.authorization.groups.Group; +import edu.harvard.iq.dataverse.authorization.groups.GroupServiceBean; +import edu.harvard.iq.dataverse.authorization.users.User; +import edu.harvard.iq.dataverse.settings.SettingsServiceBean; +import static edu.harvard.iq.dataverse.util.JsfHelper.JH; +import edu.harvard.iq.dataverse.util.SystemConfig; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.ejb.EJB; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang.StringUtils; + +/** + * + * @author gdurand + */ +@ViewScoped +@Named +public class DataverseHeaderFragment implements java.io.Serializable { + + private static final Logger logger = Logger.getLogger(DataverseHeaderFragment.class.getName()); + + @EJB + DataverseServiceBean dataverseService; + + @EJB + SettingsServiceBean settingsService; + + @EJB + GroupServiceBean groupService; + + @EJB + PermissionServiceBean permissionService; + + @EJB + SystemConfig systemConfig; + + @Inject + DataverseSession dataverseSession; + + @EJB + UserNotificationServiceBean userNotificationService; + + List<Breadcrumb> breadcrumbs = new ArrayList(); + + private Long unreadNotificationCount = null; + + public List<Breadcrumb> getBreadcrumbs() { + return breadcrumbs; + } + + public void setBreadcrumbs(List<Breadcrumb> breadcrumbs) { + this.breadcrumbs = breadcrumbs; + } + + public void initBreadcrumbs(DvObject dvObject) { + if (dvObject.getId() != null) { + initBreadcrumbs(dvObject, null); + } else { + initBreadcrumbs(dvObject.getOwner(), dvObject instanceof Dataverse ? JH.localize("newDataverse") : + dvObject instanceof Dataset ? JH.localize("newDataset") : null ); + } + } + + public Long getUnreadNotificationCount(Long userId){ + + if (userId == null){ + return new Long("0"); + } + + if (this.unreadNotificationCount != null){ + return this.unreadNotificationCount; + } + + try{ + this.unreadNotificationCount = userNotificationService.getUnreadNotificationCountByUser(userId); + }catch (Exception e){ + logger.warning("Error trying to retrieve unread notification count for user." + e.getMessage()); + this.unreadNotificationCount = new Long("0"); + } + return this.unreadNotificationCount; + } + + public void initBreadcrumbs(DvObject dvObject, String subPage) { + breadcrumbs.clear(); + + while (dvObject != null) { + breadcrumbs.add(0, new Breadcrumb(dvObject.getDisplayName(), dvObject)); + dvObject = dvObject.getOwner(); + } + + if (subPage != null) { + breadcrumbs.add(new Breadcrumb(subPage, null)); + } + } + + + + /* Old methods for breadcrumb and trees - currently disabled and deferred + + public List<Dataverse> getDataverses(Dataverse dataverse) { + List dataverses = new ArrayList(); + if (dataverse != null) { + dataverses.addAll(dataverse.getOwners()); + dataverses.add(dataverse); + } else { + dataverses.add(dataverseService.findRootDataverse()); + } + return dataverses; + } + + // @todo right now we just check on if published or if you are the creator; need full permission support + public boolean hasVisibleChildren(Dataverse dataverse) { + for (Dataverse dv : dataverseService.findByOwnerId(dataverse.getId())) { + if (dv.isReleased() || dv.getCreator().equals(dataverseSession.getUser())) { + return true; + } + } + + return false; + + } + + public TreeNode getDataverseTree(Dataverse dataverse) { + if (dataverse == null) { // the primefaces component seems to call this with dataverse == null for some reason + return null; + } + return getDataverseNode(dataverse, null, true); + } + + private TreeNode getDataverseNode(Dataverse dataverse, TreeNode root, boolean expand) { + // @todo right now we just check on if published or if you are the creator; need full permission support + if (dataverse.isReleased() || dataverse.getCreator().equals(dataverseSession.getUser())) { + TreeNode dataverseNode = new DefaultTreeNode(dataverse, root); + dataverseNode.setExpanded(expand); + List<Dataverse> childDataversesOfCurrentDataverse = dataverseService.findByOwnerId(dataverse.getId()); + for (Dataverse child : childDataversesOfCurrentDataverse) { + getDataverseNode(child, dataverseNode, false); + } + return dataverseNode; + } + return null; + } + */ + public String logout() { + dataverseSession.setUser(null); + + String redirectPage = getPageFromContext(); + try { + redirectPage = URLDecoder.decode(redirectPage, "UTF-8"); + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(LoginPage.class.getName()).log(Level.SEVERE, null, ex); + redirectPage = "dataverse.xhtml&alias=" + dataverseService.findRootDataverse().getAlias(); + } + + if (StringUtils.isEmpty(redirectPage)) { + redirectPage = "dataverse.xhtml&alias=" + dataverseService.findRootDataverse().getAlias(); + } + + logger.log(Level.INFO, "Sending user to = " + redirectPage); + return redirectPage + (redirectPage.indexOf("?") == -1 ? "?" : "&") + "faces-redirect=true"; + } + + public boolean isSignupAllowed() { + boolean safeDefaultIfKeyNotFound = false; + return settingsService.isTrueForKey(SettingsServiceBean.Key.AllowSignUp, safeDefaultIfKeyNotFound); + } + + public String getSignupUrl() { + String nonNullDefaultIfKeyNotFound = ""; + String signUpUrl = settingsService.getValueForKey(SettingsServiceBean.Key.SignUpUrl, nonNullDefaultIfKeyNotFound); + return signUpUrl; + } + + public String getLoginRedirectPage() { + return getRedirectPage(); + } + + // @todo consider creating a base bean, for now just make this static + public static String getRedirectPage() { + + String redirectPage = getPageFromContext(); + if (!StringUtils.isEmpty(redirectPage)) { + return "?redirectPage=" + redirectPage; + } + return ""; + } + + private static String getPageFromContext() { + try { + HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); + StringBuilder redirectPage = new StringBuilder(); + redirectPage.append(req.getServletPath()); + + // to regenerate the query string, we need to use the parameter map; however this can contain internal POST parameters + // that we don't want, so we filter through a list of paramters we do allow + // @todo verify what needs to be in this list of available parameters (for example do we want to repeat searches when you login? + List acceptableParameters = new ArrayList(); + acceptableParameters.addAll(Arrays.asList("id", "alias", "version", "q", "ownerId", "persistentId", "versionId")); + + if (req.getParameterMap() != null) { + StringBuilder queryString = new StringBuilder(); + for (Map.Entry<String, String[]> entry : ((Map<String, String[]>) req.getParameterMap()).entrySet()) { + String name = entry.getKey(); + if (acceptableParameters.contains(name)) { + String value = entry.getValue()[0]; + queryString.append(queryString.length() == 0 ? "?" : "&").append(name).append("=").append(value); + } + } + redirectPage.append(queryString); + } + + return URLEncoder.encode(redirectPage.toString(), "UTF-8"); + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(DataverseHeaderFragment.class.getName()).log(Level.SEVERE, null, ex); + } + return ""; + } + + // inner class used for breadcrumbs + public static class Breadcrumb { + + private final String breadcrumbText; + private final DvObject dvObject; + + public Breadcrumb(String breadcrumbText, DvObject dvObject) { + this.breadcrumbText = breadcrumbText; + this.dvObject = dvObject; + + } + + public String getBreadcrumbText() { + return breadcrumbText; + } + + public DvObject getDvObject() { + return dvObject; + } + + } + + public boolean isDebugShibboleth() { + return systemConfig.isDebugEnabled(); + } + + public List<String> getGroups(User user) { + List<String> groups = new ArrayList<>(); + Set<Group> groupsForUser = groupService.groupsFor(user, null); + for (Group group : groupsForUser) { + groups.add(group.getDisplayName() + " (" + group.getIdentifier() + ")"); + } + return groups; + } + + public List<String> getPermissions(User user, Dataverse dataverse) { + List<String> permissions = new ArrayList<>(); + for (Permission permission : permissionService.permissionsFor(user, dataverse)) { + permissions.add(permission.name()); + } + return permissions; + } +}
