Class LoopbackPort

java.lang.Object
org.refcodes.component.ConnectionAutomatonImpl<PM>
org.refcodes.serial.AbstractPort<PortMetrics>
org.refcodes.serial.LoopbackPort
All Implemented Interfaces:
Flushable, Comparable<Port<?>>, org.refcodes.component.Closable, org.refcodes.component.Closable.CloseAutomaton, org.refcodes.component.ClosedAccessor, org.refcodes.component.ConnectableComponent, org.refcodes.component.ConnectableComponent.ConnectableAutomaton, org.refcodes.component.ConnectionComponent<PortMetrics>, org.refcodes.component.ConnectionComponent.ConnectionAutomaton<PortMetrics>, org.refcodes.component.ConnectionOpenable<PortMetrics>, org.refcodes.component.ConnectionOpenable.ConnectionOpenAutomaton<PortMetrics>, org.refcodes.component.ConnectionOpenable.ConnectionOpenBuilder<PortMetrics,Port<PortMetrics>>, org.refcodes.component.ConnectionStatusAccessor, org.refcodes.component.Flushable, org.refcodes.component.LinkComponent, org.refcodes.component.LinkComponent.LinkAutomaton, org.refcodes.component.Openable, org.refcodes.component.Openable.OpenAutomaton, org.refcodes.component.Openable.OpenBuilder<Port<PortMetrics>>, org.refcodes.component.OpenedAccessor, org.refcodes.io.Availability, org.refcodes.io.ByteDestination, org.refcodes.io.ByteReceiver, org.refcodes.io.BytesDestination, org.refcodes.io.ByteSource, org.refcodes.io.BytesReceiver, org.refcodes.io.BytesSource, org.refcodes.io.BytesTransceiver, org.refcodes.io.BytesTransmitter, org.refcodes.io.ByteTransceiver, org.refcodes.io.ByteTransmitter, org.refcodes.io.Receivable, org.refcodes.io.Skippable, org.refcodes.io.TimeoutInputStreamAccessor, org.refcodes.io.Transmittable, org.refcodes.mixin.AliasAccessor, org.refcodes.mixin.InputStreamAccessor, org.refcodes.mixin.OutputStreamAccessor, Port<PortMetrics>, PortMetricsAccessor<PortMetrics>, SegmentDestination, SegmentReceiver, SegmentSource, SegmentTransceiver, SegmentTransmitter, SerialReceiver, SerialTransceiver, SerialTransmitter
Direct Known Subclasses:
CrossoverLoopbackPort

public class LoopbackPort extends AbstractPort<PortMetrics> implements Port<PortMetrics>
The LoopbackPort is an in-memory implementation of a Port which loops its output directly back to its input. This is suitable for straight forward cases where data is first transmitted to be received in the next step by the same Port. For cases using a some kind of frequent handshake between a transmitter and a receiver on the same line please use the CrossoverLoopbackPort as counterpart of a LoopbackPort for simulating a bidirectional in-memory communication between these two ports.
  • Nested Class Summary

    Nested classes/interfaces inherited from interface org.refcodes.mixin.AliasAccessor

    org.refcodes.mixin.AliasAccessor.AliasBuilder<B extends org.refcodes.mixin.AliasAccessor.AliasBuilder<B>>, org.refcodes.mixin.AliasAccessor.AliasMutator, org.refcodes.mixin.AliasAccessor.AliasProperty

    Nested classes/interfaces inherited from interface org.refcodes.io.BytesReceiver

    org.refcodes.io.BytesReceiver.ReceiverInputStream

    Nested classes/interfaces inherited from interface org.refcodes.io.BytesTransmitter

    org.refcodes.io.BytesTransmitter.TransmitterOutputStream

    Nested classes/interfaces inherited from interface org.refcodes.component.Closable

    org.refcodes.component.Closable.CloseAutomaton, org.refcodes.component.Closable.CloseBuilder<B extends org.refcodes.component.Closable.CloseBuilder<B>>

    Nested classes/interfaces inherited from interface org.refcodes.component.ClosedAccessor

    org.refcodes.component.ClosedAccessor.ClosedMutator, org.refcodes.component.ClosedAccessor.ClosedProperty

    Nested classes/interfaces inherited from interface org.refcodes.component.ConnectableComponent

    org.refcodes.component.ConnectableComponent.ConnectableAutomaton

    Nested classes/interfaces inherited from interface org.refcodes.component.ConnectionComponent

    org.refcodes.component.ConnectionComponent.ConnectionAutomaton<CON extends Object>, org.refcodes.component.ConnectionComponent.ConnectionComponentBuilder<CON extends Object,B extends org.refcodes.component.ConnectionComponent.ConnectionComponentBuilder<CON,B>>

    Nested classes/interfaces inherited from interface org.refcodes.component.ConnectionOpenable

    org.refcodes.component.ConnectionOpenable.ConnectionOpenAutomaton<CON extends Object>, org.refcodes.component.ConnectionOpenable.ConnectionOpenBuilder<CON extends Object,B extends org.refcodes.component.ConnectionOpenable.ConnectionOpenBuilder<CON,B>>

    Nested classes/interfaces inherited from interface org.refcodes.component.ConnectionStatusAccessor

    org.refcodes.component.ConnectionStatusAccessor.ConnectionStatusMutator, org.refcodes.component.ConnectionStatusAccessor.ConnectionStatusProperty

    Nested classes/interfaces inherited from interface org.refcodes.component.Flushable

    org.refcodes.component.Flushable.FlushBuilder<B extends org.refcodes.component.Flushable.FlushBuilder<B>>

    Nested classes/interfaces inherited from interface org.refcodes.mixin.InputStreamAccessor

    org.refcodes.mixin.InputStreamAccessor.InputStreamBuilder<B extends org.refcodes.mixin.InputStreamAccessor.InputStreamBuilder<?>>, org.refcodes.mixin.InputStreamAccessor.InputStreamMutator, org.refcodes.mixin.InputStreamAccessor.InputStreamProperty

    Nested classes/interfaces inherited from interface org.refcodes.component.LinkComponent

    org.refcodes.component.LinkComponent.LinkAutomaton, org.refcodes.component.LinkComponent.LinkComponentBuilder<B extends org.refcodes.component.LinkComponent.LinkComponentBuilder<B>>

    Nested classes/interfaces inherited from interface org.refcodes.component.Openable

    org.refcodes.component.Openable.OpenAutomaton, org.refcodes.component.Openable.OpenBuilder<B extends org.refcodes.component.Openable.OpenBuilder<B>>

    Nested classes/interfaces inherited from interface org.refcodes.component.OpenedAccessor

    org.refcodes.component.OpenedAccessor.OpenedMutator, org.refcodes.component.OpenedAccessor.OpenedProperty

    Nested classes/interfaces inherited from interface org.refcodes.mixin.OutputStreamAccessor

    org.refcodes.mixin.OutputStreamAccessor.OutputStreamBuilder<B extends org.refcodes.mixin.OutputStreamAccessor.OutputStreamBuilder<?>>, org.refcodes.mixin.OutputStreamAccessor.OutputStreamMutator, org.refcodes.mixin.OutputStreamAccessor.OutputStreamProperty

    Nested classes/interfaces inherited from interface org.refcodes.io.TimeoutInputStreamAccessor

    org.refcodes.io.TimeoutInputStreamAccessor.TimeoutInputStreamBuilder<B extends org.refcodes.io.TimeoutInputStreamAccessor.TimeoutInputStreamBuilder<?>>, org.refcodes.io.TimeoutInputStreamAccessor.TimeoutInputStreamMutator, org.refcodes.io.TimeoutInputStreamAccessor.TimeoutInputStreamProperty
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected LoopbackPort
     
     

    Fields inherited from class org.refcodes.serial.AbstractPort

    _alias, _executorService, _portMetrics

    Fields inherited from class org.refcodes.component.ConnectionAutomatonImpl

    _connectionComponent
  • Constructor Summary

    Constructors
    Constructor
    Description
    Constructs a LoopbackPort.
    LoopbackPort(String aAlias, ExecutorService aExecutorService)
    Constructs a LoopbackPort.
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    Returns the number of bytes which can be read directly e.g. which are already been stored in an internal buffer.
    void
    Attention: Implementations of this method should do a Object.notifyAll() in order to terminate any pending asynchronous operations such as SegmentReceiver.onReceiveSegment(Segment) or SegmentReceiver.onReceiveSegment(Segment, SegmentConsumer).
    Returns the unambiguous technical name of the TTY-/COM-Port.
    Retrieves the PortMetrics from the PortMetrics property.
    void
    Attention: Implementations of this method should do a Object.notifyAll() in order to terminate any pending asynchronous operations such as SegmentReceiver.onReceiveSegment(Segment) or SegmentReceiver.onReceiveSegment(Segment, SegmentConsumer).
    void
    receiveBytes(byte[] aBuffer, int aOffset, int aLength)
    protected void
    Hook to set a crossover loopback port in order to attach a LoopbackPort to the other end of the wire and transform a loopback device into two crossover loopback devices.
    void
    Transmits a Sequence (and blocks this thread) till all it's data has been sent.
    withOpen(PortMetrics aPortMetrics)

    Methods inherited from class org.refcodes.component.ConnectionAutomatonImpl

    getConnectionStatus, isClosable, isClosed, isOpenable, isOpened

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

    Methods inherited from interface org.refcodes.io.Availability

    hasAvailable

    Methods inherited from interface org.refcodes.io.BytesReceiver

    getInputStream, getInputStream, receiveAllBytes, receiveBytesWithin, receiveBytesWithin, receiveByteWithin, skip

    Methods inherited from interface org.refcodes.io.BytesSource

    transmitByte

    Methods inherited from interface org.refcodes.io.BytesTransmitter

    getOutputStream

    Methods inherited from interface org.refcodes.component.Closable

    closeIn, closeQuietly, closeUnchecked

    Methods inherited from interface org.refcodes.component.Closable.CloseAutomaton

    isClosable

    Methods inherited from interface org.refcodes.component.ClosedAccessor

    isClosed

    Methods inherited from interface org.refcodes.component.ConnectionOpenable

    open, openUnchecked

    Methods inherited from interface org.refcodes.component.ConnectionOpenable.ConnectionOpenAutomaton

    isOpenable

    Methods inherited from interface org.refcodes.component.ConnectionStatusAccessor

    getConnectionStatus, isOpened

    Methods inherited from interface org.refcodes.component.Flushable

    flushUnchecked, isFlushable

    Methods inherited from interface org.refcodes.component.Openable

    openUnchecked

    Methods inherited from interface org.refcodes.component.Openable.OpenAutomaton

    isOpenable

    Methods inherited from interface org.refcodes.serial.Port

    compareTo

    Methods inherited from interface org.refcodes.serial.SegmentReceiver

    onReceiveSegment, onReceiveSegment

    Methods inherited from interface org.refcodes.serial.SegmentTransmitter

    doTransmitSegment, doTransmitSegment, flush

    Methods inherited from interface org.refcodes.serial.SerialReceiver

    receiveByte, receiveBytes, receiveSegmentWithin, receiveSequence, receiveSequenceWithin

    Methods inherited from interface org.refcodes.serial.SerialTransceiver

    receiveSegment, transmitSegment

    Methods inherited from interface org.refcodes.serial.SerialTransmitter

    flush, transmitAllBytes, transmitBytes, transmitSequence

    Methods inherited from interface org.refcodes.io.Skippable

    skipAvailable, skipAvailableExcept, skipAvailableTill, skipAvailableTillSilenceFor, skipAvailableTillSilenceFor, skipAvailableWithin, skipAvailableWithin, skipAvailableWithin
  • Field Details

  • Constructor Details

    • LoopbackPort

      public LoopbackPort(String aAlias)
      Constructs a LoopbackPort.
      Parameters:
      aAlias - The alias to use for this port.
    • LoopbackPort

      public LoopbackPort(String aAlias, ExecutorService aExecutorService)
      Constructs a LoopbackPort.
      Parameters:
      aAlias - The alias to use for this port.
      aExecutorService - The ExecutorService to be used when invoking asynchronously working methods.
  • Method Details

    • transmitSequence

      public void transmitSequence(Sequence aSequence) throws IOException
      Transmits a Sequence (and blocks this thread) till all it's data has been sent.
      Specified by:
      transmitSequence in interface SerialTransmitter
      Parameters:
      aSequence - The Sequence containing the data to be send.
      Throws:
      IOException - thrown in case of I/O issues (e.g. a timeout) while sending
    • receiveBytes

      public void receiveBytes(byte[] aBuffer, int aOffset, int aLength) throws IOException
      Specified by:
      receiveBytes in interface org.refcodes.io.BytesDestination
      Throws:
      IOException
    • getPortMetrics

      public PortMetrics getPortMetrics()
      Retrieves the PortMetrics from the PortMetrics property.
      Specified by:
      getPortMetrics in interface PortMetricsAccessor<PortMetrics>
      Returns:
      The PortMetrics stored by the PortMetrics property.
    • getAlias

      public String getAlias()
      Returns the unambiguous technical name of the TTY-/COM-Port.
      Specified by:
      getAlias in interface org.refcodes.mixin.AliasAccessor
      Overrides:
      getAlias in class AbstractPort<PortMetrics>
      Returns:
      The port's name.
    • available

      public int available()
      Returns the number of bytes which can be read directly e.g. which are already been stored in an internal buffer. May return (0 or) a value less than 0 (-1) when it is not supported. Similar to InputStream.available(): "Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream. The next invocation might be the same thread or another thread. A single read or skip of this many bytes will not block, but may read or skip fewer bytes. Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream. A subclass' implementation of this method may choose to throw an IOException if this input stream has been closed by invoking the close() method. The available method for class InputStream always returns 0. This method should be overridden by subclasses."
      Specified by:
      available in interface org.refcodes.io.Availability
      Specified by:
      available in interface SerialReceiver
      Specified by:
      available in interface org.refcodes.io.Skippable
      Returns:
      The number of available bytes: An estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking or 0 when it reaches the end of the input stream. Throws:
    • open

      public void open() throws IOException
      Attention: Implementations of this method should do a Object.notifyAll() in order to terminate any pending asynchronous operations such as SegmentReceiver.onReceiveSegment(Segment) or SegmentReceiver.onReceiveSegment(Segment, SegmentConsumer).
      Specified by:
      open in interface org.refcodes.component.Openable
      Specified by:
      open in interface SerialReceiver
      Overrides:
      open in class AbstractPort<PortMetrics>
      Throws:
      IOException
    • close

      public void close() throws IOException
      Attention: Implementations of this method should do a Object.notifyAll() in order to terminate any pending asynchronous operations such as SegmentReceiver.onReceiveSegment(Segment) or SegmentReceiver.onReceiveSegment(Segment, SegmentConsumer).
      Specified by:
      close in interface org.refcodes.component.Closable
      Specified by:
      close in interface SerialReceiver
      Overrides:
      close in class AbstractPort<PortMetrics>
      Throws:
      IOException
    • withOpen

      public LoopbackPort withOpen() throws IOException
      Specified by:
      withOpen in interface org.refcodes.component.Openable.OpenBuilder<Port<PortMetrics>>
      Throws:
      IOException
    • withOpen

      public LoopbackPort withOpen(PortMetrics aPortMetrics) throws IOException
      Specified by:
      withOpen in interface org.refcodes.component.ConnectionOpenable.ConnectionOpenBuilder<PortMetrics,Port<PortMetrics>>
      Throws:
      IOException
    • withOpenUnchecked

      public LoopbackPort withOpenUnchecked()
      Specified by:
      withOpenUnchecked in interface org.refcodes.component.Openable.OpenBuilder<Port<PortMetrics>>
    • withOpenUnchecked

      public LoopbackPort withOpenUnchecked(PortMetrics aPortMetrics)
      Specified by:
      withOpenUnchecked in interface org.refcodes.component.ConnectionOpenable.ConnectionOpenBuilder<PortMetrics,Port<PortMetrics>>
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • setCrossoverPort

      protected void setCrossoverPort(LoopbackPort aPort)
      Hook to set a crossover loopback port in order to attach a LoopbackPort to the other end of the wire and transform a loopback device into two crossover loopback devices.
      Parameters:
      aPort - The LoopbackPort to act as the crossover loopback device at the other end of the wire.