/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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 org.apache.nifi.cluster.coordination.http.replication;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.nifi.cluster.manager.NodeResponse;
import org.apache.nifi.cluster.protocol.NodeIdentifier;
/**
* A response that is provided when an HTTP Request is made that must be federated to nodes in the cluster
*/
public interface AsyncClusterResponse {
/**
* @return the unique identifier of the request
*/
String getRequestIdentifier();
/**
* @return the HTTP Method that was used for the request
*/
String getMethod();
/**
* @return the Path of the URI that was used for the request
*/
String getURIPath();
/**
* @return a Set that contains the Node Identifier of each node to which the request was replicated
*/
Set<NodeIdentifier> getNodesInvolved();
/**
* @return a Set that contains the Node Identifier of each node for which the request has completed (either with
* a successful response or a timeout)
*/
Set<NodeIdentifier> getCompletedNodeIdentifiers();
/**
* @return a Set that contains the Node Response of each node for which the request has completed (either with a
* successful response or a timeout)
*/
Set<NodeResponse> getCompletedNodeResponses();
/**
* @return <code>true</code> if all nodes have responded (or timed out), <code>false</code> if still waiting on a response
* from one or more nodes
*/
boolean isComplete();
/**
* Indicates whether or not the request was created more than the specified amount of time ago.
* For example, if called via
* <code>isOlderThan(3, TimeUnit.SECONDS)</code>
* the method will return <code>true</code> if the request was created more than 3 seconds ago.
*
* @param time the amount of time to check
* @param timeUnit the associated time unit
* @return <code>true</code> if the request was created before (now - time)
*/
boolean isOlderThan(long time, TimeUnit timeUnit);
/**
* @return the {@link NodeResponse} that represents the merged result from all nodes, or <code>null</code> if this request
* is not yet complete
*
* @throws RuntimeException if the request could not be completed for some reason, a
* RuntimeException will be thrown that indicates why the request failed
*/
NodeResponse getMergedResponse();
/**
* Blocks until the request has completed and then returns the merged response
*
* @return the NodeResponse that represents the merged result from all nodes
*
* @throws InterruptedException if the thread is interrupted while waiting
* @throws RuntimeException if the request could not be completed for some reason, a
* RuntimeException will be thrown that indicates why the request failed
*/
NodeResponse awaitMergedResponse() throws InterruptedException;
/**
* Blocks until the request has completed or until the given timeout elapses. At that point, if the request has completed, then
* the merged response is returned. If the timeout elapses before the request completes, then <code>null</code> will be returned.
*
* @return the NodeResponse that represents the merged result from all nodes, or <code>null</code> if the given timeout elapses
* before the request completes
*
* @throws InterruptedException if the thread is interrupted while waiting
* @throws RuntimeException if the request could not be completed for some reason, a
* RuntimeException will be thrown that indicates why the request failed
*
*/
NodeResponse awaitMergedResponse(long timeout, TimeUnit timeUnit) throws InterruptedException;
/**
* Returns the NodeResponse that represents the individual response from the node with the given identifier
*
* @param nodeId the ID of the node whose response is to be returned
* @return the NodeResponse from the node with the given identifier, or <code>null</code> if there is no response yet from the given node
*/
NodeResponse getNodeResponse(NodeIdentifier nodeId);
}