blob: 63d511b909278f3ba6a6aacd28a29755c6f7b893 [file] [log] [blame]
/*
* 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.qpid.protonj2.engine;
import org.apache.qpid.protonj2.engine.exceptions.EngineStateException;
import org.apache.qpid.protonj2.types.UnsignedLong;
import org.apache.qpid.protonj2.types.messaging.Source;
import org.apache.qpid.protonj2.types.messaging.Target;
import org.apache.qpid.protonj2.types.messaging.Terminus;
import org.apache.qpid.protonj2.types.transactions.Coordinator;
import org.apache.qpid.protonj2.types.transport.Attach;
import org.apache.qpid.protonj2.types.transport.Detach;
import org.apache.qpid.protonj2.types.transport.Flow;
import org.apache.qpid.protonj2.types.transport.ReceiverSettleMode;
import org.apache.qpid.protonj2.types.transport.Role;
import org.apache.qpid.protonj2.types.transport.SenderSettleMode;
/**
* Base API for {@link Sender} and {@link Receiver} links.
*
* @param <L> The link type that this {@link Link} represents, {@link Sender} or {@link Receiver}
*/
public interface Link<L extends Link<L>> extends Endpoint<L> {
/**
* Detach this end of the link.
*
* @return this Link.
*
* @throws EngineStateException if an error occurs detaching the {@link Link} or the Engine is shutdown.
*/
L detach();
/**
* Returns true if this {@link Link} is currently locally detached meaning the state returned
* from {@link Link#getState()} is equal to {@link LinkState#DETACHED}. A link
* is locally detached after a call to {@link Link#detach()}.
*
* @return true if the link is locally closed.
*
* @see Link#isLocallyOpen()
* @see Link#isLocallyClosed()
*/
boolean isLocallyDetached();
/**
* Returns true if this {@link Link} is currently locally detached or locally closed meaning the
* state returned from {@link Link#getState()} is equal to {@link LinkState#DETACHED} or
* {@link LinkState#CLOSED}. A link is locally detached after a call to {@link Link#detach()} and
* is locally closed after a call to {@link Link#close()}.
*
* @return true if the link is locally closed or detached.
*
* @see Link#isLocallyOpen()
* @see Link#isLocallyDetached()
* @see Link#isLocallyClosed()
*/
boolean isLocallyClosedOrDetached();
/**
* @return the local link state
*/
LinkState getState();
/**
* Get the credit that is currently available or assigned to this link.
*
* @return the current link credit.
*/
int getCredit();
/**
* Indicates if the link is draining. For a {@link Sender} link this indicates that the
* remote has requested that the Sender transmit deliveries up to the currently available
* credit or indicate that it has no more to send. For a {@link Receiver} this indicates
* that the Receiver has requested that the Sender consume its outstanding credit.
*
* @return true if the {@link Link} is currently marked as draining.
*/
boolean isDraining();
/**
* @return the {@link Role} that this end of the link is performing.
*/
Role getRole();
/**
* @return true if this link is acting in a sender {@link Role}.
*/
boolean isSender();
/**
* @return true if this link is acting in a receiver {@link Role}.
*/
boolean isReceiver();
/**
* @return the parent {@link Connection} for the {@link Link}
*/
Connection getConnection();
/**
* @return the parent {@link Session} of the {@link Link}
*/
Session getSession();
/**
* @return the parent {@link Session} of the {@link Link}
*/
@Override
Session getParent();
/**
* @return the link name that is assigned to this {@link Link}
*/
String getName();
/**
* Sets the sender settle mode.
* <p>
* Should only be called during link set-up, i.e. before calling {@link #open()}. If this endpoint is the
* initiator of the link, this method can be used to set a value other than the default.
* <p>
* If this endpoint is not the initiator, this method should be used to set a local value. According
* to the AMQP spec, the application may choose to accept the sender's suggestion
* (accessed by calling {@link #getRemoteSenderSettleMode()}) or choose another value. The value
* has no effect on Proton, but may be useful to the application at a later point.
* <p>
* In order to be AMQP compliant the application is responsible for honoring the settlement mode. See {@link Link}.
*
* @param senderSettleMode
* The {@link SenderSettleMode} that will be set on the local end of this link.
*
* @return this Link.
*
* @throws IllegalStateException if the {@link Link} has already been opened.
*/
L setSenderSettleMode(SenderSettleMode senderSettleMode) throws IllegalStateException;
/**
* Gets the local link sender settlement mode.
*
* @return the local sender settlement mode, or null if none was set.
*
* @see #setSenderSettleMode(SenderSettleMode)
*/
SenderSettleMode getSenderSettleMode();
/**
* Sets the receiver settle mode.
* <p>
* Should only be called during link set-up, i.e. before calling {@link #open()}. If this endpoint
* is the initiator of the link, this method can be used to set a value other than the default.
*
* Used in analogous way to {@link #setSenderSettleMode(SenderSettleMode)}
*
* @param receiverSettleMode
* The {@link ReceiverSettleMode} that will be set on the local end of this link.
*
* @return this Link.
*
* @throws IllegalStateException if the {@link Link} has already been opened.
*/
L setReceiverSettleMode(ReceiverSettleMode receiverSettleMode) throws IllegalStateException;
/**
* Gets the local link receiver settlement mode.
*
* @return the local receiver settlement mode, or null if none was set.
*
* @see #setReceiverSettleMode(ReceiverSettleMode)
*/
ReceiverSettleMode getReceiverSettleMode();
/**
* Sets the {@link Source} to assign to the local end of this {@link Link}.
* <p>
* Must be called during link setup, i.e. before calling the {@link #open()} method.
*
* @param source
* The {@link Source} that will be set on the local end of this link.
*
* @return this Link.
*
* @throws IllegalStateException if the {@link Link} has already been opened.
*/
L setSource(Source source) throws IllegalStateException;
/**
* @return the {@link Source} for the local end of this link.
*/
Source getSource();
/**
* Sets the {@link Target} to assign to the local end of this {@link Link}.
*
* Must be called during link setup, i.e. before calling the {@link #open()} method.
*
* @param target
* The {@link Target} that will be set on the local end of this link.
*
* @return this Link.
*
* @throws IllegalStateException if the {@link Link} has already been opened.
*/
L setTarget(Target target) throws IllegalStateException;
/**
* Sets the {@link Coordinator} target to assign to the local end of this {@link Link}.
* <p>
* Must be called during link setup, i.e. before calling the {@link #open()} method.
*
* @param coordinator
* The {@link Coordinator} target that will be set on the local end of this link.
*
* @return this Link.
*
* @throws IllegalStateException if the {@link Link} has already been opened.
*/
L setTarget(Coordinator coordinator) throws IllegalStateException;
/**
* Returns the currently set Target for this {@link Link}. A link target can be either
* a {@link Target} type for a {@link Sender} or {@link Receiver} link or if the link is
* to be transaction resource then the target type will be a {@link Coordinator} instance.
*
* @param <T> The terminus type that the target should be cast to on return.
*
* @return the link target {@link Terminus} for the local end of this link.
*/
<T extends Terminus> T getTarget();
/**
* Sets the local link max message size, to be conveyed to the peer via the Attach frame
* when attaching the link to the session. Null or 0 means no limit.
* <p>
* Must be called during link setup, i.e. before calling the {@link #open()} method.
*
* @param maxMessageSize
* the local max message size value, or null to clear. 0 also means no limit.
*
* @return this Link.
*
* @throws IllegalStateException if the {@link Link} has already been opened.
*/
L setMaxMessageSize(UnsignedLong maxMessageSize) throws IllegalStateException;
/**
* Gets the local link max message size.
*
* @return the local max message size, or null if none was set. 0 also means no limit.
*
* @see #setMaxMessageSize(UnsignedLong)
*/
UnsignedLong getMaxMessageSize();
//----- View of the state of the link at the remote
/**
* Returns true if this {@link Link} is currently remotely open meaning the state returned
* from {@link Link#getRemoteState()} is equal to {@link LinkState#ACTIVE}. A link
* is remotely opened after an {@link Attach} has been received from the remote and before a
* {@link Detach} has been received from the remote.
*
* @return true if the link is remotely open.
*
* @see Link#isRemotelyClosed()
* @see Link#isRemotelyDetached()
*/
@Override
boolean isRemotelyOpen();
/**
* Returns true if this {@link Link} is currently remotely closed meaning the state returned
* from {@link Link#getRemoteState()} is equal to {@link LinkState#CLOSED}. A link
* is remotely closed after an {@link Detach} has been received from the remote with the close
* flag equal to true.
*
* @return true if the link is remotely closed.
*
* @see Link#isRemotelyOpen()
* @see Link#isRemotelyDetached()
*/
@Override
boolean isRemotelyClosed();
/**
* Returns true if this {@link Link} is currently remotely detached meaning the state returned
* from {@link Link#getRemoteState()} is equal to {@link LinkState#DETACHED}. A link
* is remotely detached after an {@link Detach} has been received from the remote with the close
* flag equal to false.
*
* @return true if the link is remotely detached.
*
* @see Link#isRemotelyOpen()
* @see Link#isRemotelyClosed()
*/
boolean isRemotelyDetached();
/**
* Returns true if this {@link Link} is currently remotely detached or closed meaning the state
* returned from {@link Link#getRemoteState()} is equal to {@link LinkState#DETACHED} or
* {@link LinkState#CLOSED}. A link is remotely detached or closed after a {@link Detach}
* has been received from the remote.
*
* @return true if the link is remotely detached or closed.
*
* @see Link#isRemotelyOpen()
* @see Link#isRemotelyClosed()
* @see Link#isRemotelyDetached()
*/
boolean isRemotelyClosedOrDetached();
/**
* @return the source {@link Terminus} for the remote end of this link.
*/
Source getRemoteSource();
/**
* Returns the remote target {@link Terminus} cast to the given type. This can be used when
* the underlying type is known by the caller or as a control to validate the assumption of the
* underlying type.
* <p>
* the currently set Target for this {@link Link}. A link target can be either a {@link Target}
* type for a {@link Sender} or {@link Receiver} link or if the link is to be transaction resource
* then the target type will be a {@link Coordinator} instance.
*
* @param <T>
* The type that the remote {@link Terminus} will be cast to on return.
*
* @return the source {@link Terminus} for the remote end of this link.
*/
<T extends Terminus> T getRemoteTarget();
/**
* Gets the remote link sender settlement mode, as conveyed from the peer via the Attach frame
* when attaching the link to the session.
*
* @return the sender settlement mode conveyed by the peer, or null if there was none.
*
* @see #setSenderSettleMode(SenderSettleMode)
*/
SenderSettleMode getRemoteSenderSettleMode();
/**
* Gets the remote link receiver settlement mode, as conveyed from the peer via the Attach frame
* when attaching the link to the session.
*
* @return the sender receiver mode conveyed by the peer, or null if there was none.
*
* @see #setReceiverSettleMode(ReceiverSettleMode)
*/
ReceiverSettleMode getRemoteReceiverSettleMode();
/**
* Gets the remote link max message size, as conveyed from the peer via the Attach frame
* when attaching the link to the session.
*
* @return the remote max message size conveyed by the peer, or null if none was set. 0 also means no limit.
*/
UnsignedLong getRemoteMaxMessageSize();
/**
* @return the remote link state (as last communicated)
*/
LinkState getRemoteState();
//----- Remote events for AMQP Link resources
/**
* Sets a {@link EventHandler} for when an this link is detached locally via a call to {@link Link#detach()}
*
* This is a convenience event that supplements the normal {@link Endpoint#localCloseHandler(EventHandler)}
* event point if set. If no local detached event handler is set the endpoint will route the detached event
* to the local closed event handler if set and allow it to process the event in one location.
* <p>
* Typically used by clients for logging or other state update event processing. Clients should not perform any
* blocking calls within this context. It is an error for the handler to throw an exception and the outcome of
* doing so is undefined.
*
* @param localDetachHandler
* The {@link EventHandler} to notify when this link is locally detached.
*
* @return the link for chaining.
*/
L localDetachHandler(EventHandler<L> localDetachHandler);
/**
* Sets a {@link EventHandler} for when an AMQP Detach frame is received from the remote peer for this
* {@link Link} which would have been locally opened previously, the Detach from would have been marked
* as not having been closed.
* <p>
* This is a convenience event that supplements the normal {@link Endpoint#closeHandler(EventHandler)}
* event point if set. If no detached event handler is set the endpoint will route the detached event to the
* closed event handler if set and allow it to process the event in one location.
*
* @param remoteDetachHandler
* The {@link EventHandler} to notify when this link is remotely closed.
*
* @return the {@link Link} for chaining.
*/
L detachHandler(EventHandler<L> remoteDetachHandler);
/**
* Handler for link credit updates that occur after a remote {@link Flow} arrives.
*
* @param handler
* An event handler that will be signaled when the link credit is updated by a remote flow.
*
* @return the {@link Link} for chaining.
*/
L creditStateUpdateHandler(EventHandler<L> handler);
/**
* Sets a {@link EventHandler} for when the parent {@link Session} or {@link Connection} of this link is
* locally closed.
* <p>
* Typically used by clients for logging or other state update event processing. Clients should not perform any
* blocking calls within this context. It is an error for the handler to throw an exception and the outcome of
* doing so is undefined.
*
* @param handler
* The {@link EventHandler} to notify when this link's parent Session is locally closed.
*
* @return the link for chaining.
*/
L parentEndpointClosedHandler(EventHandler<L> handler);
}