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

com.sap.cloud.sdk.s4hana.datamodel.messaging.jms.JmsMessagingVdmConverter Maven / Gradle / Ivy

/*
 * Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved.
 */

package com.sap.cloud.sdk.s4hana.datamodel.messaging.jms;

import java.nio.charset.StandardCharsets;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.jms.JMSException;
import javax.jms.TextMessage;

import com.google.common.annotations.Beta;
import com.sap.cloud.sdk.s4hana.datamodel.messaging.api.VdmMessages;
import com.sap.cloud.sdk.s4hana.datamodel.messaging.core.Message;
import com.sap.cloud.sdk.s4hana.datamodel.messaging.core.MessageFactory;
import com.sap.cloud.sdk.s4hana.datamodel.messaging.core.MessageFactoryMapper;
import com.sap.cloud.sdk.s4hana.datamodel.messaging.core.MessagingException;
import com.sap.cloud.sdk.s4hana.datamodel.messaging.core.MessagingVdmConverter;

import io.vavr.control.Option;

/**
 * Generic converter for turning JMS messages into Messaging VDM objects.
 *
 * This relies on {@link MessageFactoryMapper} objects to pick the right {@link MessageFactory} based on the message
 * type.
 *
 * Multiple {@link MessageFactoryMapper} objects can be configured, and each {@link MessageFactoryMapper} can have
 * mappings for the same message type. In this case, the mapping of the most recently added {@link MessageFactoryMapper}
 * is used.
 */
@Beta
public class JmsMessagingVdmConverter
{
    private final MessagingVdmConverter messageConverter;

    /**
     * Creates a converter instance with the built-in mappings from {@link VdmMessages} added.
     */
    public JmsMessagingVdmConverter()
    {
        messageConverter = new MessagingVdmConverter(new VdmMessages());
    }

    /**
     * Creates a converter instance with the built-in mappings from {@link VdmMessages} added, plus the provided
     * {@link MessageFactoryMapper} instances on top. Note that in case of duplicate mappings, the one from the
     * right-most {@link MessageFactoryMapper} will be used.
     *
     * @param messageFactoryMappers
     *            Mapping classes that implement the {@link MessageFactoryMapper} interface and map message types to
     *            message factory class names.
     */
    public JmsMessagingVdmConverter( @Nonnull final MessageFactoryMapper... messageFactoryMappers )
    {
        this();
        messageConverter.addMessageFactoryMappers(messageFactoryMappers);
    }

    /**
     * Augment existing converter with provided {@link MessageFactoryMapper} instances. Note that in case of duplicate
     * mappings, the one from the right-most {@link MessageFactoryMapper} will be used.
     *
     * @param messageFactoryMappers
     *            Mapping classes that implement the {@link MessageFactoryMapper} interface and map message types to
     *            message factory class names.
     */
    public void addMessageFactoryMappers( @Nonnull final MessageFactoryMapper... messageFactoryMappers )
    {
        messageConverter.addMessageFactoryMappers(messageFactoryMappers);
    }

    /**
     * Translates JMS messages into Messaging VDM objects.
     *
     * @param incomingMessage
     *            The original JMS message.
     * @return A Messaging VDM object representation of the original JMS message.
     * @throws MessagingException
     *             If there are problems parsing the JMS message or converting it to a Messaging VDM object.
     */
    @Nullable
    public Message fromJmsMessage( @Nullable final javax.jms.Message incomingMessage )
        throws MessagingException
    {
        if( incomingMessage != null ) {
            final String payload = extractPayload(incomingMessage);
            return messageConverter.fromMessage(payload);
        }
        return null;
    }

    private String extractPayload( @Nonnull final javax.jms.Message message )
        throws MessagingException
    {
        try {
            final Option maybePayload = extractFromTextMessage(message);
            return maybePayload.isDefined() ? maybePayload.get() : extractFromGenericMessage(message);
        }
        catch( final JMSException e ) {
            throw new MessagingException(
                "An Exception was thrown while extracting the payload from a message. Message: \n" + message,
                e);
        }
    }

    private Option extractFromTextMessage( @Nonnull final javax.jms.Message message )
        throws JMSException
    {
        return (message instanceof TextMessage) ? Option.of(((TextMessage) message).getText()) : Option.none();
    }

    private String extractFromGenericMessage( @Nonnull final javax.jms.Message message )
        throws JMSException
    {
        return new String(message.getBody(byte[].class), StandardCharsets.UTF_8);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy