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

com.artipie.http.group.GroupSlice Maven / Gradle / Ivy

There is a newer version: v1.17.16
Show newest version
/*
 * The MIT License (MIT) Copyright (c) 2020-2023 artipie.com
 * https://github.com/artipie/artipie/blob/master/LICENSE.txt
 */
package com.artipie.http.group;

import com.artipie.http.Response;
import com.artipie.http.Slice;
import com.artipie.http.rq.RequestLineFrom;
import com.artipie.http.rq.RqMethod;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.reactivestreams.Publisher;

/**
 * Standard group {@link Slice} implementation.
 *
 * @since 0.11
 */
public final class GroupSlice implements Slice {

    /**
     * Methods to broadcast to all target slices.
     */
    private static final Set BROADCAST_METHODS = Collections.unmodifiableSet(
        new HashSet<>(
            Arrays.asList(
                RqMethod.GET, RqMethod.HEAD, RqMethod.OPTIONS, RqMethod.CONNECT, RqMethod.TRACE
            )
        )
    );

    /**
     * Target slices.
     */
    private final List targets;

    /**
     * New group slice.
     * @param targets Slices to group
     */
    public GroupSlice(final Slice... targets) {
        this(Arrays.asList(targets));
    }

    /**
     * New group slice.
     * @param targets Slices to group
     */
    public GroupSlice(final List targets) {
        this.targets = Collections.unmodifiableList(targets);
    }

    @Override
    public Response response(final String line, final Iterable> headers,
        final Publisher body) {
        final Response rsp;
        final RqMethod method = new RequestLineFrom(line).method();
        if (GroupSlice.BROADCAST_METHODS.contains(method)) {
            rsp = new GroupResponse(
                this.targets.stream()
                    .map(slice -> slice.response(line, headers, body))
                    .collect(Collectors.toList())
            );
        } else {
            rsp = this.targets.get(0).response(line, headers, body);
        }
        return rsp;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy