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

com.github.netty.protocol.mysql.server.ServerHandshakePacket Maven / Gradle / Ivy

/*
 * Copyright 2016 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package com.github.netty.protocol.mysql.server;

import com.github.netty.protocol.mysql.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.DefaultByteBufHolder;
import io.netty.util.AsciiString;

import java.util.*;

/**
 *
 */
public class ServerHandshakePacket extends DefaultByteBufHolder implements ServerPacket {

    public static final int DEFAULT_PROTOCOL_VERSION = 10;
    private final long timestamp = System.currentTimeMillis();
    private final int sequenceId;
    private final int protocolVersion;
    private final AsciiString serverVersion;
    private final int connectionId;
    private final Set capabilities;
    private final MysqlCharacterSet characterSet;
    private final Set serverStatus;
    private final String authPluginName;

    private ServerHandshakePacket(Builder builder) {
        super(builder.authPluginData);
        if (builder.authPluginData.readableBytes() < Constants.AUTH_PLUGIN_DATA_PART1_LEN) {
            throw new IllegalArgumentException("authPluginData can not contain less than " + Constants.AUTH_PLUGIN_DATA_PART1_LEN + " bytes.");
        }
        protocolVersion = builder.protocolVersion;
        if (builder.serverVersion == null) {
            throw new NullPointerException("serverVersion can not be null");
        }
        sequenceId = builder.sequenceId;
        serverVersion = AsciiString.of(builder.serverVersion);
        connectionId = builder.connectionId;
        capabilities = Collections.unmodifiableSet(builder.capabilities);
        characterSet = builder.characterSet;
        serverStatus = Collections.unmodifiableSet(builder.serverStatus);
        authPluginName = builder.authPluginName;
    }

    public static Builder builder() {
        return new Builder();
    }

    public int getProtocolVersion() {
        return protocolVersion;
    }

    public AsciiString getServerVersion() {
        return serverVersion;
    }

    public int getConnectionId() {
        return connectionId;
    }

    public ByteBuf getAuthPluginData() {
        return content();
    }

    public Set getCapabilities() {
        return capabilities;
    }

    public MysqlCharacterSet getCharacterSet() {
        return characterSet;
    }

    public Set getServerStatus() {
        return serverStatus;
    }

    public String getAuthPluginName() {
        return authPluginName;
    }

    @Override
    public long getTimestamp() {
        return timestamp;
    }

    @Override
    public int getSequenceId() {
        return sequenceId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        if (!super.equals(o)) {
            return false;
        }
        ServerHandshakePacket handshake = (ServerHandshakePacket) o;
        return protocolVersion == handshake.protocolVersion &&
                connectionId == handshake.connectionId &&
                Objects.equals(serverVersion, handshake.serverVersion) &&
                Objects.equals(capabilities, handshake.capabilities) &&
                characterSet == handshake.characterSet &&
                Objects.equals(serverStatus, handshake.serverStatus) &&
                Objects.equals(authPluginName, handshake.authPluginName);
    }

    @Override
    public String toString() {
        return getClass().getSimpleName() + "," + serverVersion + "," + serverStatus;
    }

    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), protocolVersion, serverVersion, connectionId, capabilities, characterSet, serverStatus, authPluginName);
    }

    public static class Builder extends AbstractAuthPluginDataBuilder {
        private int protocolVersion = DEFAULT_PROTOCOL_VERSION;
        private CharSequence serverVersion;
        private int connectionId = -1;
        private int sequenceId;
        private MysqlCharacterSet characterSet = MysqlCharacterSet.DEFAULT;
        private Set serverStatus = EnumSet.noneOf(ServerStatusFlag.class);
        private String authPluginName;

        public Builder sequenceId(int sequenceId) {
            this.sequenceId = sequenceId;
            return this;
        }

        public Builder protocolVersion(int protocolVerison) {
            this.protocolVersion = protocolVerison;
            return this;
        }

        public Builder serverVersion(CharSequence serverVersion) {
            this.serverVersion = serverVersion;
            return this;
        }

        public Builder connectionId(int connectionId) {
            this.connectionId = connectionId;
            return this;
        }

        public Builder characterSet(MysqlCharacterSet characterSet) {
            this.characterSet = characterSet == null ? MysqlCharacterSet.DEFAULT : characterSet;
            return this;
        }

        public Builder addServerStatus(ServerStatusFlag serverStatus, ServerStatusFlag... serverStatuses) {
            this.serverStatus.add(serverStatus);
            Collections.addAll(this.serverStatus, serverStatuses);
            return this;
        }

        public Builder addServerStatus(Collection serverStatus) {
            this.serverStatus.addAll(serverStatus);
            return this;
        }

        public Builder authPluginName(String authPluginName) {
            capabilities.add(CapabilityFlags.CLIENT_PLUGIN_AUTH);
            this.authPluginName = authPluginName;
            return this;
        }

        public ServerHandshakePacket build() {
            return new ServerHandshakePacket(this);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy