/* * 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.remote.protocol; import java.io.IOException; import java.util.Optional; import org.apache.nifi.groups.ProcessGroup; import org.apache.nifi.processor.ProcessContext; import org.apache.nifi.processor.ProcessSession; import org.apache.nifi.remote.Peer; import org.apache.nifi.remote.RootGroupPort; import org.apache.nifi.remote.VersionedRemoteResource; import org.apache.nifi.remote.cluster.ClusterNodeInformation; import org.apache.nifi.remote.cluster.NodeInformant; import org.apache.nifi.remote.cluster.NodeInformation; import org.apache.nifi.remote.codec.FlowFileCodec; import org.apache.nifi.remote.exception.HandshakeException; import org.apache.nifi.remote.exception.ProtocolException; public interface ServerProtocol extends VersionedRemoteResource { /** * * @param rootGroup group */ void setRootProcessGroup(ProcessGroup rootGroup); RootGroupPort getPort(); /** * Optional operation. Sets the NodeInformant to use in this Protocol, if a * NodeInformant is supported. Otherwise, throws * UnsupportedOperationException * * @param nodeInformant informant */ void setNodeInformant(NodeInformant nodeInformant); /** * Receives the handshake from the Peer * * @param peer peer * @throws IOException ioe * @throws HandshakeException he */ void handshake(Peer peer) throws IOException, HandshakeException; /** * @return <code>true</code> if the handshaking process was completed * successfully, <code>false</code> if either the handshaking process has * not happened or the handshake failed */ boolean isHandshakeSuccessful(); /** * Negotiates the FlowFileCodec that is to be used for transferring * FlowFiles * * @param peer peer * @return the codec to use * @throws IOException ioe * @throws org.apache.nifi.remote.exception.ProtocolException pe */ FlowFileCodec negotiateCodec(Peer peer) throws IOException, ProtocolException; /** * @return the codec that has already been negotiated by this Protocol, if * any */ FlowFileCodec getPreNegotiatedCodec(); /** * Reads the Request Type of the next request from the Peer * * @param peer peer * @return the RequestType that the peer would like to happen - or null, if * no data available * @throws java.io.IOException ioe */ RequestType getRequestType(Peer peer) throws IOException; /** * Sends FlowFiles to the specified peer * * @param peer peer * @param context context * @param session session * @param codec codec * * @return the number of FlowFiles transferred * @throws java.io.IOException ioe * @throws org.apache.nifi.remote.exception.ProtocolException pe */ int transferFlowFiles(Peer peer, ProcessContext context, ProcessSession session, FlowFileCodec codec) throws IOException, ProtocolException; /** * Receives FlowFiles from the specified peer * * @param peer peer * @param context context * @param session session * @param codec codec * @throws IOException ioe * * @return the number of FlowFiles received * @throws ProtocolException pe */ int receiveFlowFiles(Peer peer, ProcessContext context, ProcessSession session, FlowFileCodec codec) throws IOException, ProtocolException; /** * @return the number of milliseconds after a request is received for which * the request is still valid. A valid of 0 indicates that the request will * not expire */ long getRequestExpiration(); /** * Sends a list of all nodes in the cluster to the specified peer. If not in * a cluster, sends info about itself * * @param peer peer * @param clusterNodeInfo the cluster information * @param self the node which received the request * * @throws java.io.IOException ioe */ void sendPeerList( Peer peer, Optional<ClusterNodeInformation> clusterNodeInfo, NodeInformation self) throws IOException; void shutdown(Peer peer); boolean isShutdown(); }