uk.ac.starlink.table

## Class OnceRowPipe

- java.lang.Object
- - uk.ac.starlink.table.OnceRowPipe

- All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, RowData, RowPipe, RowSequence, TableSink, Sequence

      public class OnceRowPipe
      extends java.lang.Object
      implements RowPipe, RowSequence

  Streaming `RowPipe` implementation which provides a one-shot table. The returned table is unusual in that it can only return a `RowSequence` once. This violates the normal rules of the `StarTable` interface. Any calls beyond the first to `waitForStarTable().getRowSequence()` will throw a `UnrepeatableSequenceException`.
  Since:
    10 Feb 2005

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `OnceRowPipe()` Constructs a new streaming row store with a default buffer size.
    `OnceRowPipe(int queueSize)` Constructs a new streaming row store with a given buffer size.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `acceptMetadata(StarTable meta)` Takes delivery of a row-less `StarTable` object which defines the metadata of the table to be transmitted.
    `void` | `acceptRow(java.lang.Object[] row)` Takes delivery of one row of data.
    `void` | `close()` Indicates that this sequence will not be required any more.
    `void` | `endRows()` Signals that there are no more rows to be transmitted.
    `java.lang.Object` | `getCell(int icol)` Returns the contents of a cell in the current row.
    `java.lang.Object[]` | `getRow()` Returns the contents of the current table row, as an array with the same number of elements as there are columns in this table.
    `boolean` | `next()` Attempts to advance the current row to the next one.
    `void` | `setError(java.io.IOException error)` May be called by the writing stream to set an I/O error on the pipe.
    `StarTable` | `waitForStarTable()` Returns a non-random table whose first call to `getRowSequence` will return a sequence that steps through the same rows which are being written to this sink.

    - ### Methods inherited from class java.lang.Object

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

- - ### Constructor Detail

    - #### OnceRowPipe

          public OnceRowPipe()

      Constructs a new streaming row store with a default buffer size.

    - #### OnceRowPipe

          public OnceRowPipe(int queueSize)

      Constructs a new streaming row store with a given buffer size.
      Parameters:
        `queueSize` - the maximum number of rows buffered between write and read before `acceptRow` will block

  - ### Method Detail

    - #### setError

          public void setError(java.io.IOException error)

      Description copied from interface: `RowPipe`
      May be called by the writing stream to set an I/O error on the pipe. This error should be passed on to the reading end by throwing an error with `e` as its cause from one of the read methods. If an error has already been set by a previous call of this method, this has no effect (only the first error is set).
      Specified by:
        `setError` in interface `RowPipe`
      Parameters:
        `error` - exception to pass to readers

    - #### acceptMetadata

          public void acceptMetadata(StarTable meta)

      Description copied from interface: `TableSink`
      Takes delivery of a row-less `StarTable` object which defines the metadata of the table to be transmitted. If the number of rows that will be transmitted via subsequent calls to `acceptRow` is known, this value should be made available as the row count of `meta` (`StarTable.getRowCount()`); if it is not known, the row count should be -1. However, this object should not attempt to read any of `meta`'s cell data.

      The data to be transmitted in subsequent calls of `acceptRow` must match the metadata transmitted in this call in the same way that rows of a StarTable must match its own metadata (number and content clases of columns etc). If this sink cannot dispose of a table corresponding to `meta` then it may throw a TableFormatException - this may be the case if for instance `meta` has columns with types that this sink can't deal with.

      Specified by:
        `acceptMetadata` in interface `TableSink`
      Parameters:
        `meta` - table metadata object

    - #### acceptRow

          public void acceptRow(java.lang.Object[] row)
                         throws java.io.IOException

      Description copied from interface: `TableSink`
      Takes delivery of one row of data. `row` is an array of objects comprising the contents of one row of the table being transmitted. The number and classes of the elements of `row` are described by the metadata object previously accepted.
      Specified by:
        `acceptRow` in interface `TableSink`
      Parameters:
        `row` - table data row
      Throws:
        `java.io.IOException`

    - #### endRows

          public void endRows()

      Description copied from interface: `TableSink`
      Signals that there are no more rows to be transmitted.
      Specified by:
        `endRows` in interface `TableSink`

    - #### waitForStarTable

          public StarTable waitForStarTable()
                                     throws java.io.IOException

      Returns a non-random table whose first call to `getRowSequence` will return a sequence that steps through the same rows which are being written to this sink. The `getRowSequence` method can only be called once; any subsequent attempts to call it will result in a `UnrepeatableSequenceException`. This method will block until `acceptMetadata(uk.ac.starlink.table.StarTable)` has been called.
      Specified by:
        `waitForStarTable` in interface `RowPipe`
      Returns:
        one-shot streaming sequential table
      Throws:
        `java.io.IOException` - if one has previously been set using `setError(java.io.IOException)`

    - #### next

          public boolean next()
                       throws java.io.IOException

      Description copied from interface: `RowSequence`
      Attempts to advance the current row to the next one. If `true` is returned the attempt has been successful, and if `false` is returned there are no more rows in this sequence. Since the initial position of a RowSequence is before the first row, this method must be called before current row data can be accessed using the `RowSequence.getCell(int)` or `RowSequence.getRow()` methods.
      Specified by:
        `next` in interface `RowSequence`
      Specified by:
        `next` in interface `Sequence`
      Returns:
        `true` iff this sequence has been advanced to the next row
      Throws:
        `java.io.IOException` - if there is some error

    - #### getRow

          public java.lang.Object[] getRow()

      Description copied from interface: `RowSequence`
      Returns the contents of the current table row, as an array with the same number of elements as there are columns in this table. An unchecked exception will be thrown if there is no current row (`next` has not yet been called).
      Specified by:
        `getRow` in interface `RowData`
      Specified by:
        `getRow` in interface `RowSequence`
      Returns:
        an array of the objects in each cell in row `irow`

    - #### getCell

          public java.lang.Object getCell(int icol)

      Description copied from interface: `RowSequence`
      Returns the contents of a cell in the current row. The class of the returned object should be the same as, or a subclass of, the class returned by `getColumnInfo(icol).getContentClass()`. An unchecked exception will be thrown if there is no current row (`next` has not yet been called).
      Specified by:
        `getCell` in interface `RowData`
      Specified by:
        `getCell` in interface `RowSequence`
      Parameters:
        `icol` - column index
      Returns:
        the contents of cell `icol` in the current row

    - #### close

          public void close()

      Description copied from interface: `RowSequence`
      Indicates that this sequence will not be required any more. This should release resources associated with this object. The effect of calling any of the other methods following a `close` is undefined.
      Specified by:
        `close` in interface `java.io.Closeable`
      Specified by:
        `close` in interface `java.lang.AutoCloseable`
      Specified by:
        `close` in interface `RowSequence`