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.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) {
      org.jsoup.parser.Parser parser = xml ? org.jsoup.parser.Parser.xmlParser() : org.jsoup.parser.Parser.htmlParser();
      return org.jsoup.helper.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 - 2025 Weber Informatics LLC | Privacy Policy