@Override
  public Object readFrom(
      Class<Object> type,
      Type genericType,
      Annotation[] annotations,
      MediaType mediaType,
      MultivaluedMap<String, String> httpHeaders,
      InputStream entityStream)
      throws IOException, WebApplicationException {
    final String entityString = readFromAsString(entityStream, mediaType);
    if (entityString.isEmpty()) {
      throw new NoContentException(LocalizationMessages.ERROR_READING_ENTITY_MISSING());
    }
    final PrimitiveTypes primitiveType = PrimitiveTypes.forType(type);
    if (primitiveType != null) {
      return primitiveType.convert(entityString);
    }

    final Constructor constructor =
        AccessController.doPrivileged(ReflectionHelper.getStringConstructorPA(type));
    if (constructor != null) {
      try {
        return type.cast(constructor.newInstance(entityString));
      } catch (Exception e) {
        throw new MessageBodyProcessingException(
            LocalizationMessages.ERROR_ENTITY_PROVIDER_BASICTYPES_CONSTRUCTOR(type));
      }
    }

    if (AtomicInteger.class.isAssignableFrom(type)) {
      return new AtomicInteger((Integer) PrimitiveTypes.INTEGER.convert(entityString));
    }

    if (AtomicLong.class.isAssignableFrom(type)) {
      return new AtomicLong((Long) PrimitiveTypes.LONG.convert(entityString));
    }

    throw new MessageBodyProcessingException(
        LocalizationMessages.ERROR_ENTITY_PROVIDER_BASICTYPES_UNKWNOWN(type));
  }