/**
* =============================================================================
*
* ORCID (R) Open Source
* http://orcid.org
*
* Copyright (c) 2012-2014 ORCID, Inc.
* Licensed under an MIT-Style License (MIT)
* http://orcid.org/open-source-license
*
* This copyright and license information (including a link to the full license)
* shall be included in its entirety in all copies or substantial portion of
* the software.
*
* =============================================================================
*/
package org.orcid.core.web.filters;
import static org.orcid.core.api.OrcidApiConstants.APPLICATION_RDFXML;
import static org.orcid.core.api.OrcidApiConstants.JSON_LD;
import static org.orcid.core.api.OrcidApiConstants.N_TRIPLES;
import static org.orcid.core.api.OrcidApiConstants.ORCID_JSON;
import static org.orcid.core.api.OrcidApiConstants.ORCID_XML;
import static org.orcid.core.api.OrcidApiConstants.TEXT_N3;
import static org.orcid.core.api.OrcidApiConstants.TEXT_TURTLE;
import static org.orcid.core.api.OrcidApiConstants.VND_ORCID_JSON;
import static org.orcid.core.api.OrcidApiConstants.VND_ORCID_XML;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.MediaType;
import org.orcid.core.manager.impl.OrcidUrlManager;
import org.springframework.web.filter.OncePerRequestFilter;
/**
*
* @author Robert Peters (rcpeters)
*
*/
public class AcceptFilter extends OncePerRequestFilter {
private static String[] accpetTypesArray = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML, VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON, TEXT_TURTLE,
TEXT_N3, N_TRIPLES, JSON_LD, APPLICATION_RDFXML };
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String accept = request.getHeader("accept");
String path = ((HttpServletRequest) request).getRequestURI();
String contentType = request.getHeader("Content-Type");
if (accept == null || accept.equals("*/*")) {
HttpServletRequestWrapper requestWrapper = null;
if (isValidAcceptType(contentType))
requestWrapper = new AcceptHeaderRequestWrapper(request, contentType);
else
if (OrcidUrlManager.getPathWithoutContextPath(request).startsWith("/oauth/"))
requestWrapper = new AcceptHeaderRequestWrapper(request, MediaType.APPLICATION_JSON);
else
requestWrapper = new AcceptHeaderRequestWrapper(request, VND_ORCID_XML);
filterChain.doFilter(requestWrapper, response);
} else {
filterChain.doFilter(request, response);
}
}
private boolean isValidAcceptType(String testAccept) {
if (testAccept == null)
return false;
for (String accept : accpetTypesArray)
if (accept.toLowerCase().indexOf(testAccept) != -1)
return true;
return false;
}
}