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

br.pro.hashi.sdx.rest.jackson.transform.ConverterMapper Maven / Gradle / Ivy

package br.pro.hashi.sdx.rest.jackson.transform;

import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Type;
import java.util.function.Consumer;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import br.pro.hashi.sdx.rest.jackson.constant.Types;
import br.pro.hashi.sdx.rest.transform.exception.SerializingException;

public class ConverterMapper {
	private final ConverterFactory converterFactory;
	private final ObjectMapper objectMapper;

	public ConverterMapper(ConverterFactory converterFactory, ObjectMapper objectMapper) {
		this.converterFactory = converterFactory;
		this.objectMapper = objectMapper
				.enable(JsonParser.Feature.AUTO_CLOSE_SOURCE)
				.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
	}

	void writeValue(Writer writer, Object body, Type type) throws IOException {
		if (body instanceof JsonNode) {
			objectMapper.getFactory().createGenerator(writer).writeTree((JsonNode) body);
			return;
		}
		if (body instanceof JsonParser) {
			JsonParser parser = (JsonParser) body;
			JsonGenerator generator = createGenerator(writer);
			JsonToken token;
			while ((token = parser.nextToken()) != null) {
				switch (token) {
				case VALUE_NULL:
					generator.writeNull();
					break;
				case VALUE_FALSE:
					generator.writeBoolean(false);
					break;
				case VALUE_TRUE:
					generator.writeBoolean(true);
					break;
				case VALUE_NUMBER_INT:
					generator.writeNumber(parser.getBigIntegerValue());
					break;
				case VALUE_NUMBER_FLOAT:
					generator.writeNumber(parser.getDecimalValue());
					break;
				case VALUE_STRING:
					generator.writeString(parser.getValueAsString());
					break;
				case FIELD_NAME:
					generator.writeFieldName(parser.currentName());
					break;
				case START_ARRAY:
					generator.writeStartArray();
					break;
				case END_ARRAY:
					generator.writeEndArray();
					break;
				case START_OBJECT:
					generator.writeStartObject();
					break;
				case END_OBJECT:
					generator.writeEndObject();
					break;
				default:
					throw new SerializingException("Token %s is not supported".formatted(token.toString()));
				}
			}
			parser.close();
			generator.flush();
			return;
		}
		if (Types.instanceOfWriterConsumer(body, type)) {
			@SuppressWarnings("unchecked")
			Consumer consumer = (Consumer) body;
			consumer.accept(createGenerator(writer));
			return;
		}
		objectMapper.writerFor(converterFactory.constructType(type)).writeValue(writer, body);
	}

	private JsonGenerator createGenerator(Writer writer) throws IOException {
		return objectMapper.getFactory()
				.createGenerator(writer)
				.useDefaultPrettyPrinter();
	}

	 T readValue(Reader reader, Type type) throws IOException {
		if (type.equals(JsonNode.class)) {
			@SuppressWarnings("unchecked")
			T body = (T) objectMapper.readTree(reader);
			return body;
		}
		if (type.equals(JsonParser.class)) {
			@SuppressWarnings("unchecked")
			T body = (T) objectMapper.getFactory().createParser(reader);
			return body;
		}
		return objectMapper.readValue(reader, converterFactory.constructType(type));
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy