package com.epam.wilma.domain.sequence; /*========================================================================== Copyright 2013-2017 EPAM Systems This file is part of Wilma. Wilma is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Wilma is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Wilma. If not, see <http://www.gnu.org/licenses/>. ===========================================================================*/ import java.sql.Timestamp; import java.util.Iterator; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import com.epam.wilma.domain.http.WilmaHttpResponse; /** * This class represents a sequence. * @author Tibor_Kovacs * */ public class WilmaSequence { private final AtomicReference<Timestamp> timestamp = new AtomicReference<>(); private final String sequenceKey; private final WilmaSequencePairs messageStore; /** * Constructs a new instance of {@link WilmaSequence}. * @param sequenceKey is the key which was created by a SequenceHandler * @param timestamp shows the time in milliseconds when the sequence will be expired * @param messageStore contains the collection of {@link RequestResponsePair}s. */ public WilmaSequence(final String sequenceKey, final Timestamp timestamp, final WilmaSequencePairs messageStore) { this.sequenceKey = sequenceKey; this.timestamp.set(timestamp); this.messageStore = messageStore; } public String getSequenceKey() { return sequenceKey; } /** * This method give back the the collection of {@link RequestResponsePair}s of the store. * @return with an UnmodifiableList of {@link RequestResponsePair}s */ public Map<String, RequestResponsePair> getPairs() { return messageStore.getMessages(); } /** * Shows whether the sequence is expired or not. * @param actualTimestamp is the timestamp of current time. * @return If the sequence is expired, its timestamp is before than the given timestamp. */ public boolean isExpired(final Timestamp actualTimestamp) { return this.timestamp.get().before(actualTimestamp); } /** * This method sets the timestamp attribute in atomic way. * @param timestamp is the new timestamp */ public void setTimeout(final Timestamp timestamp) { this.timestamp.set(timestamp); } /** * Put a WilmaHttpRequestResponsePair into messageStore. * @param loggerId is that ID which was given by Wilma * @param pair is the new WilmaHttpRequestResponsePair object which contains the arrived request */ public void addPair(final String loggerId, final RequestResponsePair pair) { messageStore.addStore(loggerId, pair); } /** * Put the given response into the messageStore. * @param response is the copy of the response */ public void addResponseToPair(final WilmaHttpResponse response) { messageStore.putIntoMessages(response); } /** * Checks if all of the requests' responses arrived with the exception of the request with the given loggerId. * @param loggerId the given loggerId * @return true if all of the responses arrived (with the exception of the request's with the given loggerId), false otherwise */ public boolean checkIfAllResponsesArrived(final String loggerId) { Map<String, RequestResponsePair> pairs = getPairs(); pairs.remove(loggerId); Iterator<RequestResponsePair> pairIterator = pairs.values().iterator(); boolean result = true; while (pairIterator.hasNext() && result) { RequestResponsePair pair = pairIterator.next(); result = pair.getResponse() != null; } return result; } }