/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.util.rest; import java.net.URI; import java.util.Collections; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriBuilder; import org.joda.beans.ser.JodaBeanMimeType; import com.google.common.collect.ImmutableMap; import com.opengamma.transport.jaxrs.FudgeRest; import com.sun.jersey.core.header.InBoundHeaders; import com.sun.jersey.spi.container.ContainerRequest; import com.sun.jersey.spi.container.ContainerRequestFilter; /** * Servlet filter to handle GET requests with a suffix instead of a mime type. * <p> * This is useful to access non HTML data in a browser. You cannot manipulate the * browser's Accept header easily (other than by writing JavaScript), so this filter * examines the incoming URL, sees if it contains a known suffix like .csv or .fudge. * If it does then it changes the Accept HTTP header to match. */ public class UrlSuffixFilter implements ContainerRequestFilter { /** * Map of suffix to mime type. */ private static final ImmutableMap<String, String> SUFFIXES; static { SUFFIXES = ImmutableMap.<String, String>builder() .put(".csv", RestUtils.TEXT_CSV) .put(".json", MediaType.APPLICATION_JSON) .put(".xml", MediaType.APPLICATION_XML) .put(".fudge", FudgeRest.MEDIA) .put(".html", MediaType.TEXT_HTML) .put(".jbjson", JodaBeanMimeType.JSON) .put(".jbxml", JodaBeanMimeType.XML) .put(".jbbin", JodaBeanMimeType.BINARY) .build(); } @Override public ContainerRequest filter(ContainerRequest request) { if (request.getMethod().equalsIgnoreCase("GET")) { URI requestUri = request.getRequestUri(); String path = requestUri.getPath(); for (String suffix : SUFFIXES.keySet()) { if (path.endsWith(suffix)) { adjustHeader(request, path, suffix); break; } } } return request; } private void adjustHeader(ContainerRequest request, String path, String suffix) { String mime = SUFFIXES.get(suffix); // change accept header InBoundHeaders headers = (InBoundHeaders) request.getRequestHeaders(); headers.put(HttpHeaders.ACCEPT, Collections.singletonList(mime)); request.setHeaders(headers); // remove suffix from the URL String newPath = path.substring(0, path.length() - suffix.length()); URI requestUri = request.getRequestUri(); URI newURI = UriBuilder.fromUri(requestUri).replacePath(newPath).build(); request.setUris(request.getBaseUri(), newURI); } }