/** * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0. */ package software.amazon.awssdk.crt.mqtt5; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import software.amazon.awssdk.crt.Log; import software.amazon.awssdk.crt.Log.LogLevel; import software.amazon.awssdk.crt.Log.LogSubject; import software.amazon.awssdk.crt.mqtt5.packets.PubAckPacket; /** * The type of data returned after calling Publish on an Mqtt5Client. The data contained varies depending * on the publish and its configuration. Use getType() to figure out what type of data is contained and either * getData() to get the data and cast it, or call getResult[Type name here]() to get the data already cast. */ public class PublishResult { private PublishResultType type; // The values for the various types of packet (currently just PubAck data) private PubAckPacket pubackData; /** * Returns the type of data that was returned after calling Publish on the Mqtt5Client. * You can use this information to determine what type of data is contained and either * getData() to get the data and cast it, or call getResult[Type name here]() to * get the data already cast. * @return The type of data contained in the PublishResult */ public PublishResultType getType() { return type; } /** * Returns the data contained in the PubAck result. This is based on the PublishResultType, * which is determined by the QoS setting in the published message. * * Note: To get the data type from this function, you will need to cast. For example, to get * the PubAck from result type of PUBACK, you will need to use the following: * PubAckPacket packet = (PubAckPacket)getValue() * * @return The data contained in the PublishResult result */ public Object getValue() { if (type == PublishResultType.NONE) { return null; } else if (type == PublishResultType.PUBACK) { return getResultPubAck(); } else { Log.log(LogLevel.Error, LogSubject.MqttClient, "PublishResult: Cannot get value - unknown type of: " + type); return null; } } /** * Returns the data contained in the PublishResult for a PublishResultType of PUBACK. * This occurs for QoS 1 and will return a PubAckPacket. * @return the data contained in the PublishResult for a PublishResultType of PUBACK. */ public PubAckPacket getResultPubAck() { return pubackData; } /** * This is only called in JNI to make a new PublishResult with QoS 0. */ private PublishResult() { this.type = PublishResultType.NONE; } /** * This is only called in JNI to make a new PublishResult with a PubAck packet (QoS 1). * @param newPubackPacket The PubAckPacket data for QoS 1 packets. Can be null if result is non QoS 1. * @return A newly created PublishResult */ private PublishResult(PubAckPacket newPubackPacket) { this.type = PublishResultType.PUBACK; this.pubackData = newPubackPacket; } /** * The type of data returned after calling Publish on an MQTT5 client. The type returned from a publish * varies based on the QoS settings of the message sent. */ public enum PublishResultType { /** * No PublishResult result data (QoS 0) * This means the PublishResult has no data and getValue will return null. */ NONE(0), /** * PublishResult result was a publish acknowledgment (PubAck - QoS 1) * This means the PublishResult has a PubAck and getValue will return * the PubAckPacket associated with the publish. */ PUBACK(1); private int result; private PublishResultType(int code) { result = code; } /** * @return The native enum integer value associated with this Java enum value */ public int getValue() { return result; } /** * Creates a Java PublishResultType enum value from a native integer value. * * @param value native integer value for PublishResultType * @return a new PublishResultType value */ public static PublishResultType getEnumValueFromInteger(int value) { PublishResultType enumValue = enumMapping.get(value); if (enumValue != null) { return enumValue; } throw new RuntimeException("Illegal PublishResultType"); } private static Map buildEnumMapping() { return Stream.of(PublishResultType.values()) .collect(Collectors.toMap(PublishResultType::getValue, Function.identity())); } private static Map enumMapping = buildEnumMapping(); } }