/**
   * Make this connection active.
   *
   * @return true if the pool item is valid, false if it should be removed.
   */
  synchronized UserPoolItem toActive(
      Subject subject, ConnectionRequestInfo info, UserPoolItem oldPoolItem)
      throws ResourceException {
    long now = Alarm.getCurrentTime();

    long maxIdleTime = _cm.getMaxIdleTime();
    long maxPoolTime = _cm.getMaxPoolTime();

    if (_hasConnectionError) return null;
    else if (0 < maxIdleTime && _poolEventTime + maxIdleTime < now) return null;
    else if (0 < maxPoolTime && _poolStartTime + maxPoolTime < now) return null;
    else if (_shareHead != null)
      throw new IllegalStateException(L.l("trying to activate active pool item."));

    _poolEventTime = now;
    _isXATransaction = _xaResource != null; // disable LT-optim by default

    UserPoolItem userPoolItem = null;

    if (oldPoolItem != null) {
      Object uConn = oldPoolItem.getUserConnection();

      if (uConn != null) _mConn.associateConnection(uConn);

      oldPoolItem.associatePoolItem(this);

      userPoolItem = oldPoolItem;
    } else userPoolItem = new UserPoolItem(_cm, this);

    if (!isValid(subject, info, userPoolItem)) return null;

    _subject = subject;
    _requestInfo = info;
    userPoolItem.associate(this, _mcf, subject, info);

    if (log.isLoggable(Level.FINE)) log.fine("allocate " + this);

    if (_cm.getSaveAllocationStackTrace())
      _allocationStackTrace =
          new IllegalStateException(L.l("Connection {0} allocation stack trace", this));

    return userPoolItem;
  }