Home / Class/ MqttCodecUtil Class — netty Architecture

MqttCodecUtil Class — netty Architecture

Architecture documentation for the MqttCodecUtil class in MqttCodecUtil.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  8cc4b5f5_1c6e_ed7b_93cd_8de978fc304c["MqttCodecUtil"]
  397b5d32_fc6d_2eaa_2392_8f94340a3c8e["MqttCodecUtil.java"]
  8cc4b5f5_1c6e_ed7b_93cd_8de978fc304c -->|defined in| 397b5d32_fc6d_2eaa_2392_8f94340a3c8e
  01a072b3_9c32_18fc_dea0_1beb8e00503a["MqttVersion()"]
  8cc4b5f5_1c6e_ed7b_93cd_8de978fc304c -->|method| 01a072b3_9c32_18fc_dea0_1beb8e00503a
  c7468cce_1660_80a5_b862_0862b4939da4["setMqttVersion()"]
  8cc4b5f5_1c6e_ed7b_93cd_8de978fc304c -->|method| c7468cce_1660_80a5_b862_0862b4939da4
  b4806cb3_33aa_2c46_ad1b_e978476a6151["isValidPublishTopicName()"]
  8cc4b5f5_1c6e_ed7b_93cd_8de978fc304c -->|method| b4806cb3_33aa_2c46_ad1b_e978476a6151
  8e24bd70_b22e_1a1b_1c9d_1978ffb7a3d3["isValidMessageId()"]
  8cc4b5f5_1c6e_ed7b_93cd_8de978fc304c -->|method| 8e24bd70_b22e_1a1b_1c9d_1978ffb7a3d3
  d8241bea_5097_fd1a_ef25_f6a275af9502["isValidClientId()"]
  8cc4b5f5_1c6e_ed7b_93cd_8de978fc304c -->|method| d8241bea_5097_fd1a_ef25_f6a275af9502
  dfe673fb_d7c6_8571_4ba2_328416a117ec["MqttFixedHeader()"]
  8cc4b5f5_1c6e_ed7b_93cd_8de978fc304c -->|method| dfe673fb_d7c6_8571_4ba2_328416a117ec
  a077046e_24d2_2753_316e_dd2314b027da["MqttCodecUtil()"]
  8cc4b5f5_1c6e_ed7b_93cd_8de978fc304c -->|method| a077046e_24d2_2753_316e_dd2314b027da

Relationship Graph

Source Code

codec-mqtt/src/main/java/io/netty/handler/codec/mqtt/MqttCodecUtil.java lines 26–132

final class MqttCodecUtil {

    static final AttributeKey<MqttVersion> MQTT_VERSION_KEY = AttributeKey.valueOf("NETTY_CODEC_MQTT_VERSION");

    static MqttVersion getMqttVersion(ChannelHandlerContext ctx) {
        Attribute<MqttVersion> attr = ctx.channel().attr(MQTT_VERSION_KEY);
        MqttVersion version = attr.get();
        if (version == null) {
            return MqttVersion.MQTT_3_1_1;
        }
        return version;
    }

    static void setMqttVersion(ChannelHandlerContext ctx, MqttVersion version) {
        Attribute<MqttVersion> attr = ctx.channel().attr(MQTT_VERSION_KEY);
        attr.set(version);
    }

    static boolean isValidPublishTopicName(String topicName) {
        // publish topic name must not contain any wildcard
        for (int i = 0; i < topicName.length(); i++) {
            char c = topicName.charAt(i);
            if (c == '#' || c == '+') {
                return false;
            }
        }
        return true;
    }

    static boolean isValidMessageId(int messageId) {
        return messageId != 0;
    }

    static boolean isValidClientId(MqttVersion mqttVersion, int maxClientIdLength, String clientId) {
        if (mqttVersion == MqttVersion.MQTT_3_1) {
            return clientId != null && clientId.length() >= MIN_CLIENT_ID_LENGTH &&
                clientId.length() <= maxClientIdLength;
        }
        if (mqttVersion == MqttVersion.MQTT_3_1_1 || mqttVersion == MqttVersion.MQTT_5) {
            // In 3.1.3.1 Client Identifier of MQTT 3.1.1 and 5.0 specifications, The Server MAY allow ClientId’s
            // that contain more than 23 encoded bytes. And, The Server MAY allow zero-length ClientId.
            return clientId != null;
        }
        throw new IllegalArgumentException(mqttVersion + " is unknown mqtt version");
    }

    static MqttFixedHeader validateFixedHeader(ChannelHandlerContext ctx, MqttFixedHeader mqttFixedHeader) {
        switch (mqttFixedHeader.messageType()) {
            case PUBREL:
            case SUBSCRIBE:
            case UNSUBSCRIBE:
                if (mqttFixedHeader.qosLevel() != MqttQoS.AT_LEAST_ONCE) {
                    throw new DecoderException(mqttFixedHeader.messageType().name() + " message must have QoS 1");
                }
                return mqttFixedHeader;
            case AUTH:
                if (MqttCodecUtil.getMqttVersion(ctx) != MqttVersion.MQTT_5) {
                    throw new DecoderException("AUTH message requires at least MQTT 5");
                }
                return mqttFixedHeader;
            default:
                return mqttFixedHeader;
        }
    }

    static MqttFixedHeader resetUnusedFields(MqttFixedHeader mqttFixedHeader) {
        switch (mqttFixedHeader.messageType()) {
            case CONNECT:
            case CONNACK:
            case PUBACK:
            case PUBREC:
            case PUBCOMP:
            case SUBACK:
            case UNSUBACK:
            case PINGREQ:
            case PINGRESP:
            case DISCONNECT:
                if (mqttFixedHeader.isDup() ||
                        mqttFixedHeader.qosLevel() != MqttQoS.AT_MOST_ONCE ||
                        mqttFixedHeader.isRetain()) {
                    return new MqttFixedHeader(

Frequently Asked Questions

What is the MqttCodecUtil class?
MqttCodecUtil is a class in the netty codebase, defined in codec-mqtt/src/main/java/io/netty/handler/codec/mqtt/MqttCodecUtil.java.
Where is MqttCodecUtil defined?
MqttCodecUtil is defined in codec-mqtt/src/main/java/io/netty/handler/codec/mqtt/MqttCodecUtil.java at line 26.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free