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

io.smallrye.reactive.messaging.amqp.AmqpMessageConverter Maven / Gradle / Ivy

The newest version!
package io.smallrye.reactive.messaging.amqp;

import java.sql.Date;
import java.time.Instant;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.qpid.proton.amqp.Binary;
import org.apache.qpid.proton.amqp.messaging.AmqpValue;
import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
import org.apache.qpid.proton.amqp.messaging.Data;
import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations;
import org.apache.qpid.proton.amqp.messaging.Footer;
import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
import org.eclipse.microprofile.reactive.messaging.Message;

import io.vertx.amqp.impl.AmqpMessageImpl;
import io.vertx.core.json.Json;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.mutiny.amqp.AmqpMessage;
import io.vertx.mutiny.core.buffer.Buffer;

public class AmqpMessageConverter {
    private static final String JSON_CONTENT_TYPE = "application/json";
    private static final String BINARY_CONTENT_TYPE = "application/octet-stream";

    private AmqpMessageConverter() {
        // Avoid direct instantiation.
    }

    static io.vertx.mutiny.amqp.AmqpMessage convertToAmqpMessage(Message message, boolean durable, long ttl) {
        Object payload = message.getPayload();
        OutgoingAmqpMetadata metadata = message.getMetadata(OutgoingAmqpMetadata.class)
                .orElse(new OutgoingAmqpMetadata());

        org.apache.qpid.proton.message.Message output = org.apache.qpid.proton.message.Message.Factory.create();

        // Header
        if (metadata.isDurable()) {
            output.setDurable(true);
        } else {
            output.setDurable(durable);
        }

        output.setPriority(metadata.getPriority());

        if (metadata.getTtl() > 0) {
            output.setTtl(metadata.getTtl());
        } else if (ttl > 0) {
            output.setTtl(ttl);
        }

        // Annotations
        DeliveryAnnotations deliveryAnnotations = metadata.getDeliveryAnnotations();
        MessageAnnotations messageAnnotations = metadata.getMessageAnnotations();
        if (!deliveryAnnotations.getValue().isEmpty()) {
            output.setDeliveryAnnotations(deliveryAnnotations);
        }
        if (!messageAnnotations.getValue().isEmpty()) {
            output.setMessageAnnotations(messageAnnotations);
        }

        // Properties
        output.setMessageId(metadata.getMessageId());
        output.setUserId(metadata.getUserId() != null ? metadata.getUserId().getBytes() : null);
        output.setAddress(metadata.getAddress());
        output.setSubject(metadata.getSubject());
        output.setReplyTo(metadata.getReplyTo());
        output.setCorrelationId(metadata.getCorrelationId());
        output.setContentType(metadata.getContentType());
        output.setContentEncoding(metadata.getContentEncoding());
        output.setExpiryTime(metadata.getExpiryTime());
        output.setCreationTime(metadata.getCreationTime());
        output.setGroupId(metadata.getGroupId());
        output.setGroupSequence(metadata.getGroupSequence());
        output.setReplyToGroupId(metadata.getReplyToGroupId());

        if (!metadata.getProperties().isEmpty()) {
            output.setApplicationProperties(new ApplicationProperties(metadata.getProperties().getMap()));
        }

        // Application data section:
        if (payload == null) {
            output.setBody(new AmqpValue(null));
        } else if (payload instanceof String || isPrimitive(payload.getClass()) || payload instanceof UUID) {
            output.setBody(new AmqpValue(payload));

        } else if (payload instanceof Buffer) {
            output.setBody(new Data(new Binary(((Buffer) payload).getBytes())));
            if (output.getContentType() == null) {
                output.setContentType(BINARY_CONTENT_TYPE);
            }
        } else if (payload instanceof io.vertx.core.buffer.Buffer) {
            output.setBody(new Data(new Binary(((io.vertx.core.buffer.Buffer) payload).getBytes())));
            if (output.getContentType() == null) {
                output.setContentType(BINARY_CONTENT_TYPE);
            }
        } else if (payload instanceof Instant) {
            output.setBody(new AmqpValue(Date.from((Instant) payload)));
        } else if (payload instanceof JsonArray) {
            byte[] bytes = ((JsonArray) payload).toBuffer().getBytes();
            output.setBody(new Data(new Binary(bytes)));
            if (output.getContentType() == null) {
                output.setContentType(JSON_CONTENT_TYPE);
            }
        } else if (payload instanceof JsonObject) {
            byte[] bytes = ((JsonObject) payload).toBuffer().getBytes();
            output.setBody(new Data(new Binary(bytes)));
            if (output.getContentType() == null) {
                output.setContentType(JSON_CONTENT_TYPE);
            }
        } else if (payload instanceof byte[]) {
            output.setBody(new Data(new Binary(((byte[]) payload))));
            if (output.getContentType() == null) {
                output.setContentType(BINARY_CONTENT_TYPE);
            }
        } else if (payload instanceof Map || payload instanceof List) {
            // This branch must be after the JSON Object and JSON Array checks
            output.setBody(new AmqpValue(payload));
        } else {
            byte[] bytes = Json.encodeToBuffer(payload).getBytes();
            output.setBody(new Data(new Binary(bytes)));
            if (output.getContentType() == null) {
                output.setContentType(JSON_CONTENT_TYPE);
            }
        }

        // Footer
        Footer footer = metadata.getFooter();
        if (!footer.getValue().isEmpty()) {
            output.setFooter(footer);
        }

        return new AmqpMessage(new AmqpMessageImpl(output));
    }

    private static final List> PRIMITIVES = Arrays.asList(
            Boolean.class,
            Byte.class,
            Character.class,
            Short.class,
            Integer.class,
            Double.class,
            Float.class,
            Long.class);

    private static boolean isPrimitive(Class clazz) {
        return clazz.isPrimitive() || PRIMITIVES.contains(clazz);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy