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

se.hiq.oss.spring.nats.message.serde.xml.JaxbMessageSerializer Maven / Gradle / Ivy

The newest version!
package se.hiq.oss.spring.nats.message.serde.xml;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.validation.Schema;

import se.hiq.oss.spring.nats.exception.SerializeException;
import se.hiq.oss.spring.nats.message.serde.NatsMessageSerializer;
import se.hiq.oss.spring.nats.message.validation.MessageObjectValidator;

public class JaxbMessageSerializer implements NatsMessageSerializer {

    private Map, JAXBContext> contextsPerClass = new ConcurrentHashMap<>();
    private Optional jaxbContext = Optional.empty();
    private XmlSchemaFactory xmlSchemaFactory = new XmlSchemaFactory();
    private Optional validator = Optional.empty();

    @Override
    public void setValidator(Optional validator) {
        this.validator = validator;
    }

    public void setJaxbContext(Optional jaxbContext) {
        this.jaxbContext = jaxbContext;
    }

    @Override
    public byte[] toMessageData(Object object) throws SerializeException {
        validator.filter(v -> v.shouldValidate(object.getClass())).ifPresent(v -> v.validate(object));
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        try (OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8)) {
            JAXBContext context = jaxbContext.orElseGet(() -> loadContextFor(object.getClass()));
            Marshaller marshaller = context.createMarshaller();
            Optional schema = xmlSchemaFactory.schemaFor(object.getClass());
            schema.ifPresent(s -> marshaller.setSchema(s));
            marshaller.marshal(object, osw);
        } catch (IOException | JAXBException e) {
            throw new SerializeException("Could not serialize " + object + " to XML", e);
        }
        return bos.toByteArray();
    }

    private JAXBContext loadContextFor(Class forType) {
        JAXBContext jaxb = contextsPerClass.get(forType);
        if (jaxb == null) {
            try {
                jaxb = JAXBContext.newInstance(forType);
                contextsPerClass.put(forType, jaxb);
            } catch (JAXBException e) {
                throw new SerializeException("Could not serialize " + forType + " to XML", e);
            }
        }
        return jaxb;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy