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

bt.net.pipeline.ChannelPipelineBuilder Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2016—2021 Andrei Tomashpolskiy and individual contributors.
 *
 * Licensed 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 bt.net.pipeline;

import bt.net.Peer;
import bt.net.buffer.BorrowedBuffer;
import bt.net.buffer.BufferMutator;
import bt.protocol.Message;
import bt.protocol.handler.MessageHandler;

import java.nio.ByteBuffer;
import java.nio.channels.ByteChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

public abstract class ChannelPipelineBuilder {

    private final Peer peer;
    private ByteChannel channel;
    private MessageHandler protocol;
    private BorrowedBuffer inboundBuffer;
    private BorrowedBuffer outboundBuffer;
    private List decoders;
    private List encoders;

    ChannelPipelineBuilder(Peer peer) {
        this.peer = Objects.requireNonNull(peer);
    }

    public ChannelPipelineBuilder channel(ByteChannel channel) {
        this.channel = Objects.requireNonNull(channel);
        return this;
    }

    public ChannelPipelineBuilder protocol(MessageHandler protocol) {
        this.protocol = Objects.requireNonNull(protocol);
        return this;
    }

    public ChannelPipelineBuilder inboundBuffer(BorrowedBuffer inboundBuffer) {
        this.inboundBuffer = Objects.requireNonNull(inboundBuffer);
        return this;
    }

    public ChannelPipelineBuilder outboundBuffer(BorrowedBuffer outboundBuffer) {
        this.outboundBuffer = Objects.requireNonNull(outboundBuffer);
        return this;
    }

    public ChannelPipelineBuilder decoders(BufferMutator firstDecoder, BufferMutator... otherDecoders) {
        Objects.requireNonNull(firstDecoder);
        decoders = asList(firstDecoder, otherDecoders);
        return this;
    }

    public ChannelPipelineBuilder encoders(BufferMutator firstEncoder, BufferMutator... otherEncoders) {
        Objects.requireNonNull(firstEncoder);
        encoders = asList(firstEncoder, otherEncoders);
        return this;
    }

    private List asList(BufferMutator firstMutator, BufferMutator... otherMutators) {
        List mutators = new ArrayList<>();
        mutators.add(firstMutator);
        if (otherMutators != null) {
            mutators.addAll(Arrays.asList(otherMutators));
        }
        return mutators;
    }

    public ChannelPipeline build() {
        Objects.requireNonNull(channel, "Missing channel");
        Objects.requireNonNull(protocol, "Missing protocol");

        Optional> _inboundBuffer = Optional.ofNullable(inboundBuffer);
        Optional> _outboundBuffer = Optional.ofNullable(outboundBuffer);
        List _decoders = (decoders == null) ? Collections.emptyList() : decoders;
        List _encoders = (encoders == null) ? Collections.emptyList() : encoders;

        return doBuild(peer, channel, protocol, _inboundBuffer, _outboundBuffer, _decoders, _encoders);
    }

    protected abstract ChannelPipeline doBuild(
            Peer peer,
            ByteChannel channel,
            MessageHandler protocol,
            Optional> inboundBuffer,
            Optional> outboundBuffer,
            List decoders,
            List encoders);
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy