/* * 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 java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.faces.context.FacesContext; import javax.faces.view.ViewScoped; import javax.inject.Inject; import javax.inject.Named; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; /** * * @author gdurand */ @ViewScoped @Named public class NavigationWrapper implements java.io.Serializable { @Inject DataverseSession session; String redirectPage; public String getRedirectPage() { return !StringUtils.isEmpty(getPageFromContext()) ? "?redirectPage=" + getPageFromContext() : ""; } public String getPageFromContext() { if (redirectPage == null) { StringBuilder redirectBuilder = new StringBuilder(); HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); redirectBuilder.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", "datasetId", "selectedFileIds", "mode", "dataverseId", "fileId", "datasetVersionId")); 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); } } redirectBuilder.append(queryString); } try { redirectPage = URLEncoder.encode(redirectBuilder.toString(), "UTF-8"); } catch (UnsupportedEncodingException ex) { Logger.getLogger(DataverseHeaderFragment.class.getName()).log(Level.SEVERE, null, ex); redirectPage = ""; } } return redirectPage; } public String notAuthorized(){ if (!session.getUser().isAuthenticated()){ return "/loginpage.xhtml" + getRedirectPage(); } else { return sendError(HttpServletResponse.SC_FORBIDDEN); } } public String notFound() { return sendError(HttpServletResponse.SC_NOT_FOUND); } private String sendError(int errorCode) { FacesContext context = FacesContext.getCurrentInstance(); try { context.getExternalContext().responseSendError(errorCode,null); } catch (IOException ex) { Logger.getLogger(PermissionsWrapper.class.getName()).log(Level.SEVERE, null, ex); } context.responseComplete(); return ""; } }