docs: private SibRaConnection createConnection(
              ConnectionRequestInfo requestInfo)
              throws SIResourceException,
              SINotPossibleInCurrentConfigurationException,
              SIIncorrectCallException, SIAuthenticationException {
  
          if (TRACE.isEntryEnabled()) {
              SibTr.entry(this, TRACE, "createConnection", requestInfo);
          }
  
          SibRaConnection result = null;
          boolean tryAgain = true;
          
          do {
  
            try {
    
                // Obtain connection via connection manager
                final Object connection = _connectionManager.allocateConnection(
                        _managedConnectionFactory, requestInfo);
    
                // Check it is one of ours
                if (connection instanceof SibRaConnection) {
    
                    result = (SibRaConnection) connection;
                    SibRaManagedConnection managedConnection = result.getManagedConnection();
  
                    // Pass a reference to this connection factory as the
                    // connection needs access to the connection manager and
                    // managed connection factory to perform lazy enlistment and
                    // association
                    result.setConnectionFactory(this);
                    
                    tryAgain = result.isCoreConnectionInValid();
                    if (tryAgain)
                    {
                      SibTr.info(TRACE, NLS.getString("CONNECTION_ERROR_RETRY_CWSIV0356"), 
                              new Object[] {result.getManagedConnection().getConnectionException()});
                      
                      // We need to try again so we clone and change the cri (incremenet counter) which 
                      // forces j2c to create a new managed connection.  Cloning is needed to prevent
                      // a broken connection in the shared pool being returned because it has a
                      // cri == this cri (PM31826)
                      requestInfo = (ConnectionRequestInfo)((SibRaConnectionRequestInfo)requestInfo).clone();
                      ((SibRaConnectionRequestInfo)requestInfo).incrementRequestCounter();
                      
                      // PK60857 the connection is broken so notify JCA to ensure it is cleaned up
                      managedConnection.connectionErrorOccurred(new SIResourceException(), true);
                    }
    
                } else {
    
                    final ResourceException exception = new ResourceAdapterInternalException(
                            NLS.getFormattedMessage(
                                    "INCORRECT_CONNECTION_TYPE_CWSIV0101",
                                    new Object[] { connection,
                                            SibRaConnection.class }, null));
                    if (TRACE.isEventEnabled()) {
                        SibTr.exception(this, TRACE, exception);
                    }
                    throw exception;
    
                }
              
            } catch (ResourceException exception) {
    
                FFDCFilter
                        .processException(
                                exception,
                                "com.ibm.ws.sib.ra.impl.SibRaConnectionFactory.createConnection",
                                "1:318:1.21", this);
                if (TRACE.isEventEnabled()) {
                    SibTr.exception(this, TRACE, exception);
                }
    
                if (exception.getCause() instanceof SIResourceException) {
    
                    // If the original exception came from the underlying core SPI
                    // throw this back to the caller...
                    throw (SIResourceException) exception.getCause();
    
                } else if (exception.getCause() instanceof SIErrorException) {
    
                    // If the original exception came from the underlying core SPI
                    // throw this back to the caller...
                    throw (SIErrorException) exception.getCause();
    
                } else if (exception.getCause() instanceof SINotPossibleInCurrentConfigurationException) {
    
                    // If the original exception came from the underlying core SPI
                    // throw this back to the caller...
                    throw (SINotPossibleInCurrentConfigurationException) exception
                            .getCause();
    
                } else if (exception.getCause() instanceof SIIncorrectCallException) {
    
                    // If the original exception came from the underlying core SPI
                    // throw this back to the caller...
                    throw (SIIncorrectCallException) exception.getCause();
    
                } else if (exception.getCause() instanceof SIAuthenticationException) {
    
                    // If the original exception came from the underlying core SPI
                    // throw this back to the caller...
                    throw (SIAuthenticationException) exception.getCause();
    
                } else {
    
                    // ...otherwise, wrap it in an SIResourceException
                    throw new SIResourceException(NLS
                            .getString("CONNECTION_FACTORY_EXCEPTION_CWSIV0050"),
                            exception);
    
                }
    
            }
          } while (tryAgain);
  
          if (TRACE.isEntryEnabled()) {
              SibTr.exit(this, TRACE, "createConnection", result);
          }
          return result;
  
      }