/*
* 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.StringUtil;
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;
@Inject
NavigationWrapper navigationWrapper;
@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 == null) {
return;
}
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 void initBreadcrumbsForFileMetadata(FileMetadata fmd) {
if (fmd == null) {
return;
}
breadcrumbs.clear();
//First Add regular breadcrumb for the data file
DvObject dvObject = fmd.getDataFile();
breadcrumbs.add(0, new Breadcrumb(dvObject, dvObject.getDisplayName()));
//Get the Dataset Owning the Datafile and add version to the breadcrumb
dvObject = dvObject.getOwner();
String optionalUrlExtension = "&version=" + fmd.getDatasetVersion().getSemanticVersion();
breadcrumbs.add(0, new Breadcrumb(dvObject, dvObject.getDisplayName(), optionalUrlExtension));
// now get Dataverse Owner of the dataset and proceed as usual
dvObject = dvObject.getOwner();
while (dvObject != null) {
breadcrumbs.add(0, new Breadcrumb(dvObject, dvObject.getDisplayName()));
dvObject = dvObject.getOwner();
}
}
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, dvObject.getDisplayName()));
dvObject = dvObject.getOwner();
}
if (subPage != null) {
breadcrumbs.add(new Breadcrumb(subPage));
}
}
/* 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 = navigationWrapper.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";
}
private Boolean signupAllowed = null;
public boolean isSignupAllowed() {
if (signupAllowed != null) {
return signupAllowed;
}
boolean safeDefaultIfKeyNotFound = false;
signupAllowed = settingsService.isTrueForKey(SettingsServiceBean.Key.AllowSignUp, safeDefaultIfKeyNotFound);
return signupAllowed;
}
public String getSignupUrl(String loginRedirect) {
String nonNullDefaultIfKeyNotFound = "";
String signUpUrl = settingsService.getValueForKey(SettingsServiceBean.Key.SignUpUrl, nonNullDefaultIfKeyNotFound);
return signUpUrl + (!signUpUrl.contains("?") ? loginRedirect : loginRedirect.replace("?", "&"));
}
public String getLoginRedirectPage() {
System.out.println("DEPRECATED call to getLoginRedirectPage method in DataverseHeaderfragment: " + navigationWrapper.getRedirectPage());
return navigationWrapper.getRedirectPage();
}
public void addBreadcrumb (String url, String linkString){
breadcrumbs.add(new Breadcrumb(url, linkString));
}
public void addBreadcrumb (String linkString){
breadcrumbs.add(new Breadcrumb(linkString));
}
// inner class used for breadcrumbs
public static class Breadcrumb {
private final String breadcrumbText;
private DvObject dvObject = null;
private String url = null;
private String optionalUrlExtension = null;
public Breadcrumb( DvObject dvObject, String breadcrumbText, String optionalUrlExtension ) {
this.breadcrumbText = breadcrumbText;
this.dvObject = dvObject;
this.optionalUrlExtension = optionalUrlExtension;
}
public Breadcrumb( DvObject dvObject, String breadcrumbText) {
this.breadcrumbText = breadcrumbText;
this.dvObject = dvObject;
}
public Breadcrumb( String url, String breadcrumbText) {
this.breadcrumbText = breadcrumbText;
this.url = url;
}
public Breadcrumb(String breadcrumbText){
this.breadcrumbText = breadcrumbText;
}
public String getBreadcrumbText() {
return breadcrumbText;
}
public DvObject getDvObject() {
return dvObject;
}
public String getUrl() {
return url;
}
public String getOptionalUrlExtension() {
return optionalUrlExtension;
}
}
}