view src/main/java/edu/harvard/iq/dataverse/DataverseHeaderFragment.java @ 12:c2e2d794847f

new: add config.properties file for gazetteer
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Wed, 30 Sep 2015 13:43:54 +0200
parents a50cf11e5178
children
line wrap: on
line source

/*
 * 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.InetAddress;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.net.UnknownHostException;
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;
    }
}