All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.springframework.http.converter.StringHttpMessageConverterCustom Maven / Gradle / Ivy

package org.springframework.http.converter;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import org.jsoup.helper.DataUtil;
import org.jsoup.parser.Parser;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.MediaType;
import org.springframework.util.ClassUtils;
import org.springframework.util.LinkedCaseInsensitiveMap;

public class StringHttpMessageConverterCustom extends StringHttpMessageConverter {
  private static final Set textValues = new HashSet(1);
  private static final Set xmlValues = new HashSet(3);

  static {
    textValues.add(new MediaType(MediaType.TEXT_XML.getType(), MediaType.ALL.getType()));

    xmlValues.add(MediaType.TEXT_XML);
    xmlValues.add(MediaType.APPLICATION_XML);
    xmlValues.add(new MediaType(MediaType.TEXT_XML.getType(), MediaType.ALL.getType() + '+' + MediaType.TEXT_XML.getSubtype()));
  }

  private final boolean jsoup = ClassUtils.isPresent("org.jsoup.Jsoup", getClass().getClassLoader());

  public StringHttpMessageConverterCustom(Charset defaultCharset) {
    super(defaultCharset);
  }

  /**
   * @see java.nio.charset.Charset#defaultCharset()
   */
  @Override
  protected List getAcceptedCharsets() {
    return Arrays.asList(getDefaultCharset());
  }

  @Override
  protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException {
    MediaType mediaType = inputMessage.getHeaders().getContentType();
    if (this.jsoup && mediaType.getCharset() == null) {
      Charset charset = getCharset(mediaType, inputMessage.getBody());
      if (charset != null && !charset.equals(getDefaultCharset())) {
        Map parameters = new LinkedCaseInsensitiveMap(mediaType.getParameters().size() + 1, Locale.ENGLISH);
        if (mediaType.getParameters().size() > 0) {
          parameters.putAll(mediaType.getParameters());
        }
        parameters.putAll(new MediaType(mediaType, charset).getParameters());
        inputMessage.getHeaders().setContentType(new MediaType(mediaType, parameters));
      }
    }
    return super.readInternal(clazz, inputMessage);
  }

  /**
   * text/*, application/xml, or application/xhtml+xml
   * 

* * Pattern.compile("(application|text)/\\w*\\+?xml.*") * */ protected Charset getCharset(MediaType mediaType, InputStream inputStream) throws IOException { boolean text = isText(mediaType); boolean xml = isXml(mediaType); if (text || xml) { Parser parser = xml ? Parser.xmlParser() : Parser.htmlParser(); return DataUtil.load(inputStream, null, "", parser).charset(); } return null; } protected boolean isText(MediaType mediaType) { for (MediaType xmlMediaType : textValues) { if (xmlMediaType.includes(mediaType)) { return true; } } return false; } protected boolean isXml(MediaType mediaType) { for (MediaType xmlMediaType : xmlValues) { if (xmlMediaType.includes(mediaType)) { return true; } } return false; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy