diff --git a/Gamelib b/Gamelib index a4c5102..65c33d8 160000 --- a/Gamelib +++ b/Gamelib @@ -1 +1 @@ -Subproject commit a4c510279a35bfd10da62b3026eb2ed4c3c369ad +Subproject commit 65c33d886c9c8f2d4a06356f32ad6d772b60e7ee diff --git a/Server/src/main/java/uulm/teamname/marvelous/server/Lobby/pipelining/Pipeline.java b/Server/src/main/java/uulm/teamname/marvelous/server/Lobby/pipelining/Pipeline.java index 8f1cee2..bcfe4ff 100644 --- a/Server/src/main/java/uulm/teamname/marvelous/server/Lobby/pipelining/Pipeline.java +++ b/Server/src/main/java/uulm/teamname/marvelous/server/Lobby/pipelining/Pipeline.java @@ -7,6 +7,7 @@ import uulm.teamname.marvelous.gamelibrary.requests.Request; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -32,22 +33,33 @@ public class Pipeline { * {@link Event events} relevant to the {@link Segment segment}. The {@link Event Events} are returned at the * end of the pipeline. * @param requests are the requests that are being pipelined through the pipeline - * @return a {@link Tuple}<{@link Boolean}, {@link Event}[]>, whereby the {@link Boolean} declares whether the - * execution of the {@link Pipeline} is successful. If that is the case, the events can be ignored, - * and an error message can be sent to the client. + * @return a {@link Optional}<{@link Event}[]>, whereby the state of the {@link Optional} declares whether the + * execution of the {@link Pipeline} was successful. If the optional is empty, the input requests were + * invalid, and an error message can be sent to the client. To get the {@link Event Events} + * out of the {@link Optional}, first check whether the {@link Optional} is empty by doing + * {@link Optional#isEmpty()} or {@link Optional#isPresent()}, and act accordingly. */ - public Tuple processRequests(Request[] requests) { + public Optional processRequests(Request[] requests) { + // The packet carries the requests, and gets smaller per segment List packet = Arrays.asList(requests); + // The packet is filled by the requests resulting from events per segment List carrier = new ArrayList<>(); - AtomicBoolean abort = new AtomicBoolean(); - abort.set(false); + // The abort boolean describes whether an abort happened in a segment + AtomicBoolean abort = new AtomicBoolean(false); + + // Loop through all segments for (Segment segment: segments) { + // Give the segment the packet, carrier and abort, and let it process requests segment.processRequests(packet, carrier, abort); - if (packet.size() == 0 || abort.get()) { - break; + if (packet.size() == 0 || abort.get()) { // if packet is empty (all requests processed) or abort initiated + break; // (abort boolean true), break out of the loop } } - return new Tuple (abort.get(), carrier.toArray(new Event[0])); + if (abort.get()) { // if abort is true, return empty optional + return Optional.empty(); + } else { // else return an optional of the array + return Optional.of(carrier.toArray(new Event[0])); + } } /**