/* * Copyright 2014 NAVER Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.web.util; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; public class MappingJsonpJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter { private static final String cbPrefix = "("; private static final String cbSuffix = ")"; private static final String cbEnd = ";"; private static final String DEFAULT_CALLBACK_PARAMETER = "_"; private static final List<MediaType> DEFAULT_MEDIA_TYPES = new ArrayList<MediaType>() { { add(new MediaType("application", "x-javascript")); add(new MediaType("application", "javascript")); add(new MediaType("text", "javascript")); } }; public MappingJsonpJackson2HttpMessageConverter() { setSupportedMediaTypes(DEFAULT_MEDIA_TYPES); } @Override protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { JsonGenerator jsonGenerator = getJsonGenerator(outputMessage); try { String callbackParam = getRequestParam(DEFAULT_CALLBACK_PARAMETER); if (StringUtils.isEmpty(callbackParam)) { callbackParam = DEFAULT_CALLBACK_PARAMETER; } jsonGenerator.writeRaw(callbackParam); jsonGenerator.writeRaw(cbPrefix); getObjectMapper().writeValue(jsonGenerator, object); jsonGenerator.writeRaw(cbSuffix); jsonGenerator.writeRaw(cbEnd); jsonGenerator.flush(); } catch (JsonProcessingException e) { throw new HttpMessageNotWritableException("Could not write JSON:" + e.getMessage(), e); } } private JsonGenerator getJsonGenerator(HttpOutputMessage outputMessage) throws IOException { JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType()); return getObjectMapper().getFactory().createGenerator(outputMessage.getBody(), encoding); } private String getRequestParam(String paramName) { return getServletRequest().getParameter(paramName); } private HttpServletRequest getServletRequest() { return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); } }