docs: @Override
      public BifurcatedConsumerSession createBifurcatedConsumerSession(long id)
  
                      throws SISessionUnavailableException, SISessionDroppedException,
                      SIConnectionUnavailableException, SIConnectionDroppedException,
                      SIErrorException,
                      SINotAuthorizedException,
                      SIIncorrectCallException
      {
          if (TraceComponent.isAnyTracingEnabled() && CoreSPIConnection.tc.isEntryEnabled())
              SibTr.entry(CoreSPIConnection.tc, "createBifurcatedConsumerSession",
                          new Object[] { this, Long.valueOf(id) });
  
          // Check that the connection isn't closed.
          checkNotClosed();
  
          ConsumerSessionImpl session = findConsumerSession(id);
  
          // If the consumer session is null, throw a SISessionNotFoundException
          if (session == null)
          {
              // Add correct NLS trace
              SISessionUnavailableException e =
                              new SISessionUnavailableException(
                                              nls.getFormattedMessage(
                                                                      "CREATE_CONSUMER_ERROR_CWSIP0092",
                                                                      new Object[] { Long.valueOf(id),
                                                                                    _messageProcessor.getMessagingEngineName() },
                                                                      null));
  
              if (TraceComponent.isAnyTracingEnabled() && CoreSPIConnection.tc.isEntryEnabled())
                  SibTr.exit(CoreSPIConnection.tc, "createBifurcatedConsumerSession", e);
              throw e;
          }
  
          if (!session.isBifurcatable())
          {
              SIIncorrectCallException e =
                              new SIIncorrectCallException(
                                              nls.getFormattedMessage(
                                                                      "CONSUMER_NOT_BIFURCATABLE_CWSIP0680",
                                                                      new Object[] { Long.valueOf(id) },
                                                                      null));
  
              if (TraceComponent.isAnyTracingEnabled() && CoreSPIConnection.tc.isEntryEnabled())
                  SibTr.exit(CoreSPIConnection.tc, "createBifurcatedConsumerSession", e);
              throw e;
          }
  
          // Now we have the ConsumerSession, create a Bifurcated Consumer
          BifurcatedConsumerSessionImpl consumerSession = new BifurcatedConsumerSessionImpl(this, session);
  
          // Add the new Bifurcated consumer to the list.
          synchronized (_bifurcatedConsumers)
          {
              _bifurcatedConsumers.add(consumerSession);
          }
  
          // if security is enabled, audit the creation of the new session
          if (_isBusSecure)
          {
              AuthUtils sibAuthUtils = _messageProcessor.getAuthorisationUtils();
  
              // get the destination name from the session
              String destination = consumerSession.getDestinationAddress().getDestinationName();
  
              // call through to audit event for successful creation
              sibAuthUtils.createBifurcatedConsumerSessionAuthorizationPassed(_subject, destination, id);
          }
  
          if (TraceComponent.isAnyTracingEnabled() && CoreSPIConnection.tc.isEntryEnabled())
              SibTr.exit(CoreSPIConnection.tc, "createBifurcatedConsumerSession", consumerSession);
  
          return consumerSession;
      }