From f294331945dbf2108871367b655bdb4f1c2afc8a Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Fri, 8 Jan 2021 15:54:57 -0500 Subject: [PATCH] GH-3455: default MqttMessageConverter.toMessage Fixes https://github.com/spring-projects/spring-integration/issues/3455 After introduction `MqttMessageConverter.toMessageBuilder()` (https://github.com/spring-projects/spring-integration/issues/3181) the existing `MqttMessageConverter` must also implement this new method where in most cases `toMessage()` call `toMessageBuilder()` * Make `MqttMessageConverter.toMessage()` as a `default` with a delegation to the `toMessageBuilder()` allowing target implementors to avoid extra method --- .../support/DefaultPahoMessageConverter.java | 16 ++++++---------- .../mqtt/support/MqttMessageConverter.java | 16 +++++++++++++--- .../integration/mqtt/MqttAdapterTests.java | 16 ++++++---------- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/support/DefaultPahoMessageConverter.java b/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/support/DefaultPahoMessageConverter.java index eb40a5e343..20b05716ea 100644 --- a/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/support/DefaultPahoMessageConverter.java +++ b/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/support/DefaultPahoMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.integration.mqtt.support; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -57,9 +58,9 @@ public class DefaultPahoMessageConverter implements MqttMessageConverter, BeanFa private BytesMessageMapper bytesMessageMapper; - private volatile boolean payloadAsBytes = false; + private boolean payloadAsBytes = false; - private volatile BeanFactory beanFactory; + private BeanFactory beanFactory; private volatile MessageBuilderFactory messageBuilderFactory = new DefaultMessageBuilderFactory(); @@ -82,7 +83,7 @@ public class DefaultPahoMessageConverter implements MqttMessageConverter, BeanFa * @param defaultRetained the default retained. */ public DefaultPahoMessageConverter(int defaultQos, boolean defaultRetained) { - this(defaultQos, defaultRetained, "UTF-8"); + this(defaultQos, defaultRetained, StandardCharsets.UTF_8.name()); } /** @@ -124,7 +125,7 @@ public class DefaultPahoMessageConverter implements MqttMessageConverter, BeanFa public DefaultPahoMessageConverter(int defaultQos, MessageProcessor qosProcessor, boolean defaultRetained, MessageProcessor retainedProcessor) { - this(defaultQos, qosProcessor, defaultRetained, retainedProcessor, "UTF-8"); + this(defaultQos, qosProcessor, defaultRetained, retainedProcessor, StandardCharsets.UTF_8.name()); } /** @@ -204,11 +205,6 @@ public class DefaultPahoMessageConverter implements MqttMessageConverter, BeanFa return toMessage(null, (MqttMessage) mqttMessage); } - @Override - public Message toMessage(String topic, MqttMessage mqttMessage) { - return toMessageBuilder(topic, mqttMessage).build(); - } - @Override public AbstractIntegrationMessageBuilder toMessageBuilder(String topic, MqttMessage mqttMessage) { try { diff --git a/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/support/MqttMessageConverter.java b/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/support/MqttMessageConverter.java index 287163e113..67891f9234 100644 --- a/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/support/MqttMessageConverter.java +++ b/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/support/MqttMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,8 @@ import org.springframework.messaging.converter.MessageConverter; * a header. * * @author Gary Russell + * @author Artem Bilan + * * @since 4.0 * */ @@ -35,12 +37,20 @@ public interface MqttMessageConverter extends MessageConverter { /** * Convert to a Message. - * + * The default implementation calls {@link #toMessageBuilder(String, MqttMessage)}. * @param topic the topic. * @param mqttMessage the MQTT message. * @return the Message. */ - Message toMessage(String topic, MqttMessage mqttMessage); + default Message toMessage(String topic, MqttMessage mqttMessage) { + AbstractIntegrationMessageBuilder builder = toMessageBuilder(topic, mqttMessage); + if (builder != null) { + return builder.build(); + } + else { + return null; + } + } /** * Convert to a message builder. diff --git a/spring-integration-mqtt/src/test/java/org/springframework/integration/mqtt/MqttAdapterTests.java b/spring-integration-mqtt/src/test/java/org/springframework/integration/mqtt/MqttAdapterTests.java index 266a28155d..87fad048bd 100644 --- a/spring-integration-mqtt/src/test/java/org/springframework/integration/mqtt/MqttAdapterTests.java +++ b/spring-integration-mqtt/src/test/java/org/springframework/integration/mqtt/MqttAdapterTests.java @@ -312,25 +312,21 @@ public class MqttAdapterTests { adapter.setConverter(new MqttMessageConverter() { - @Override public Message toMessage(String topic, MqttMessage mqttMessage) { + @Override + public AbstractIntegrationMessageBuilder toMessageBuilder(String topic, MqttMessage mqttMessage) { return null; } - @Override public AbstractIntegrationMessageBuilder toMessageBuilder(String topic, - MqttMessage mqttMessage) { - + @Override + public Object fromMessage(Message message, Class targetClass) { return null; } - @Override public Object fromMessage(Message message, Class targetClass) { + @Override + public Message toMessage(Object payload, MessageHeaders headers) { return null; } - @Override public Message toMessage(Object payload, MessageHeaders headers) { - return null; - } - - }); callback.get().messageArrived("baz", message);