Module org.firebirdsql.jaybird
Package org.firebirdsql.gds.ng

# Class AbstractFbAttachment<T extends AbstractConnection<? extends IAttachProperties<?>,? extends FbAttachment>>

java.lang.Object
org.firebirdsql.gds.ng.AbstractFbAttachment<T>

All Implemented Interfaces:
  `AutoCloseable`, `FbAttachment`, `ExceptionListenable`

Direct Known Subclasses:
  `AbstractFbDatabase`, `AbstractFbService`

public abstract class AbstractFbAttachment<T extends AbstractConnection<? extends IAttachProperties<?>,? extends FbAttachment>> extends Object implements FbAttachment
Common behavior for `AbstractFbService` and `AbstractFbDatabase`.

Since:
  3.0
Author:
  Mark Rotteveel

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected final T`
  `connection`
  `protected final ExceptionListenerDispatcher`
  `exceptionListenerDispatcher`

- ## Constructor Summary

  Constructors
  Modifier
  Constructor
  Description
  `protected`
  `AbstractFbAttachment(T connection, DatatypeCoder datatypeCoder)`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `final void`
  `addExceptionListener(ExceptionListener listener)`
  Adds an exception listener to this object.
  `protected abstract void`
  `checkConnected()`
  Checks if the attachment is connected, and throws a `SQLException` if it isn't connected.
  `void`
  `forceClose()`
  Forces the connection to close without proper detach or cleanup.
  `final DatatypeCoder`
  `getDatatypeCoder()`
  `final Encoding`
  `getEncoding()`
  `final IEncodingFactory`
  `getEncodingFactory()`
  `int`
  `getNetworkTimeout()`
  Gets the current network timeout for this attachment.
  `GDSServerVersion`
  `getServerVersion()`
  `boolean`
  `isAttached()`
  Current attachment status.
  `final boolean`
  `isLockedByCurrentThread()`
  Queries if the lock is held by the current thread.
  `final void`
  `removeExceptionListener(ExceptionListener listener)`
  Removes an exception listener to this object.
  `protected final void`
  `requireNotAttached()`
  Checks if not currently attached.
  `protected final void`
  `safelyDetach()`
  Performs `FbAttachment.close()` suppressing any exception.
  `protected final void`
  `setAttached()`
  Called when this attachment is attached.
  `protected final void`
  `setDetached()`
  Called when this attachment is detached.
  `protected final void`
  `setServerVersion(String... versionStrings)`
  Sets the Firebird version from one or more version string elements.
  `final LockCloseable`
  `withLock()`
  Locks the lock with `Lock.lock()` (or equivalent).

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

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

  ### Methods inherited from interface org.firebirdsql.gds.ng.FbAttachment

  `attach, close, getHandle, setNetworkTimeout`

- ## Field Details

  - ### exceptionListenerDispatcher

    protected final ExceptionListenerDispatcher exceptionListenerDispatcher

  - ### connection

    protected final T extends AbstractConnection<? extends IAttachProperties<?>,? extends FbAttachment> connection

- ## Constructor Details

  - ### AbstractFbAttachment

    protected AbstractFbAttachment(T connection, DatatypeCoder datatypeCoder)

- ## Method Details

  - ### withLock

    public final LockCloseable withLock()
    Description copied from interface: `FbAttachment`
    Locks the lock with `Lock.lock()` (or equivalent).

    The returned `LockClosable` can be used to unlock, preferably for use in a try-with-resources.

    Specified by:
      `withLock` in interface `FbAttachment`
    Returns:
      lock closeable which unlocks the lock on close

  - ### isLockedByCurrentThread

    public final boolean isLockedByCurrentThread()
    Description copied from interface: `FbAttachment`
    Queries if the lock is held by the current thread.
    Specified by:
      `isLockedByCurrentThread` in interface `FbAttachment`
    Returns:
      `true` if current thread holds this lock and `false` otherwise
    See Also:
      - `ReentrantLock.isHeldByCurrentThread()`

  - ### forceClose

    public void forceClose() throws SQLException
    Forces the connection to close without proper detach or cleanup.

    If a given implementation does not support this, then this method should call `FbAttachment.close()`.

    Default implementation, calls `FbAttachment.close()`

    Specified by:
      `forceClose` in interface `FbAttachment`
    Throws:
      `SQLException` - For problems closing the connection.

  - ### getServerVersion

    public GDSServerVersion getServerVersion()
    Specified by:
      `getServerVersion` in interface `FbAttachment`
    Returns:
      Firebird version string

  - ### setServerVersion

    protected final void setServerVersion(String... versionStrings)
    Sets the Firebird version from one or more version string elements.

    This method should only be called by this instance.

    Parameters:
      `versionStrings` - Raw version strings

  - ### setAttached

    protected final void setAttached()
    Called when this attachment is attached.

    Only this `AbstractFbDatabase` instance should call this method.

  - ### isAttached

    public boolean isAttached()
    Description copied from interface: `FbAttachment`
    Current attachment status.
    Specified by:
      `isAttached` in interface `FbAttachment`
    Returns:
      `true` if connected to the server and attached to a database or service, `false` otherwise.

  - ### setDetached

    protected final void setDetached()
    Called when this attachment is detached.

    Only this `AbstractFbAttachment` instance should call this method.

  - ### getEncodingFactory

    public final IEncodingFactory getEncodingFactory()
    Specified by:
      `getEncodingFactory` in interface `FbAttachment`
    Returns:
      The `IEncodingFactory` for this connection

  - ### getEncoding

    public final Encoding getEncoding()
    Specified by:
      `getEncoding` in interface `FbAttachment`
    Returns:
      The connection encoding (should be the same as returned from calling `IEncodingFactory.getDefaultEncoding()` on the result of `FbAttachment.getEncodingFactory()`).

  - ### getDatatypeCoder

    public final DatatypeCoder getDatatypeCoder()
    Specified by:
      `getDatatypeCoder` in interface `FbAttachment`
    Returns:
      The `DatatypeCoder` for this database implementation.

  - ### getNetworkTimeout

    public int getNetworkTimeout() throws SQLException
    Description copied from interface: `FbAttachment`
    Gets the current network timeout for this attachment.
    Specified by:
      `getNetworkTimeout` in interface `FbAttachment`
    Returns:
      Timeout in milliseconds, 0 means no timeout
    Throws:
      `SQLException` - If this attachment is closed
      `SQLFeatureNotSupportedException` - If this attachment doesn't support network timeout

  - ### addExceptionListener

    public final void addExceptionListener(ExceptionListener listener)
    Description copied from interface: `ExceptionListenable`
    Adds an exception listener to this object.

    Implementations use `WeakReference`.

    Specified by:
      `addExceptionListener` in interface `ExceptionListenable`
    Parameters:
      `listener` - Listener to register

  - ### removeExceptionListener

    public final void removeExceptionListener(ExceptionListener listener)
    Description copied from interface: `ExceptionListenable`
    Removes an exception listener to this object.
    Specified by:
      `removeExceptionListener` in interface `ExceptionListenable`
    Parameters:
      `listener` - Listener to remove

  - ### checkConnected

    protected abstract void checkConnected() throws SQLException
    Checks if the attachment is connected, and throws a `SQLException` if it isn't connected.
    Throws:
      `SQLException`

  - ### safelyDetach

    protected final void safelyDetach()
    Performs `FbAttachment.close()` suppressing any exception.

  - ### requireNotAttached

    protected final void requireNotAttached() throws SQLException
    Checks if not currently attached.
    Throws:
      `SQLException` - if this attachment is currently attached
    Since:
      6