docs: private String toStringExternal() {
          StringBuffer buf = new StringBuffer();
          StringBuffer unsharedBuf = new StringBuffer();
          StringBuffer sharedBuf = new StringBuffer();
          StringBuffer freeBuf = new StringBuffer();
  
          buf.append("PoolManager@");
          buf.append(Integer.toHexString(hashCode()));
          buf.append(nl);
          buf.append("name=");
          buf.append(obn.toString());
          buf.append(nl);
          buf.append("jndiName=");
          if (_pm.gConfigProps == null || _pm.gConfigProps.getJNDIName() == null) {
              buf.append("none");
          } else {
              buf.append(_pm.gConfigProps.getJNDIName());
          }
          buf.append(nl);
          buf.append("maxPoolSize=");
          buf.append(_pm.maxConnections);
          buf.append(nl);
          buf.append("size=");
          buf.append(_pm.totalConnectionCount.get());
          buf.append(nl);
          int numUnsharedConnections = 0, numSharedConnections = 0, numFreeConnections = 0;
          _pm.mcToMCWMapWrite.lock();
          try {
              int mcToMCWSize = _pm.mcToMCWMap.size();
              if (mcToMCWSize > 0) {
                  Object[] tempObject = _pm.mcToMCWMap.values().toArray();
                  com.ibm.ejs.j2c.MCWrapper mcw = null;
                  for (int ti = 0; ti < mcToMCWSize; ++ti) {
                      mcw = (com.ibm.ejs.j2c.MCWrapper) tempObject[ti];
                      switch (mcw.getPoolState()) {
                          case 1: // In free pool (aka available)
                              ++numFreeConnections;
                              freeBuf.append(" ManagedConnection@");
                              freeBuf.append(Integer.toHexString(mcw.hashCode()));
                              freeBuf.append('=');
                              // Append a state string to the connection
                              freeBuf.append(translateStateString(mcw.getStateString()));
                              freeBuf.append(nl);
                              break;
                          case 2: // In shared pool
                              ++numSharedConnections;
                              sharedBuf.append(" ManagedConnection@");
                              sharedBuf.append(Integer.toHexString(mcw.hashCode()));
                              sharedBuf.append('=');
                              sharedBuf.append(translateStateString(mcw.getStateString()));
                              // Check if connection is about to be purged
                              if (mcw.isDestroyState()
                                  || mcw.isStale()
                                  || mcw.hasFatalErrorNotificationOccurred(_pm.freePool[0].getFatalErrorNotificationTime())
                                  || ((_pm.agedTimeout != -1) && (mcw.hasAgedTimedOut(_pm.agedTimeoutMillis)))) {
                                  sharedBuf.append("ToBePurged");
                              }
                              sharedBuf.append(" thread=");
                              sharedBuf.append(mcw.getThreadID());
                              sharedBuf.append(" transaction=");
                              sharedBuf.append(mcw.getTranWrapperId());
                              sharedBuf.append(" connectionHandles=");
                              sharedBuf.append(mcw.mcwHandleList.size());
                              sharedBuf.append(nl);
                              break;
                          case 3: // In unshared pool
                              ++numUnsharedConnections;
                              unsharedBuf.append(" ManagedConnection@");
                              unsharedBuf.append(Integer.toHexString(mcw.hashCode()));
                              unsharedBuf.append('=');
                              unsharedBuf.append(translateStateString(mcw.getStateString()));
                              // Check if connection is about to be purged
                              if (mcw.isStale()
                                  || mcw.hasFatalErrorNotificationOccurred(_pm.freePool[0].getFatalErrorNotificationTime())
                                  || ((_pm.agedTimeout != -1) && (mcw.hasAgedTimedOut(_pm.agedTimeoutMillis)))) {
                                  unsharedBuf.append("ToBePurged");
                              }
                              unsharedBuf.append(" thread=");
                              unsharedBuf.append(mcw.getThreadID());
                              unsharedBuf.append(nl);
                              break;
                          default:
                              break;
                      }
                  }
              }
          } finally {
              _pm.mcToMCWMapWrite.unlock();
          }
          // Waiting info
          buf.append("waiting=" + _pm.waiterCount);
          buf.append(nl);
          // Unshared info
          buf.append("unshared=");
          buf.append(numUnsharedConnections);
          buf.append(nl);
          if (numUnsharedConnections > 0) {
              buf.append(unsharedBuf);
          }
          //Shared info
          buf.append("shared=");
          buf.append(numSharedConnections);
          buf.append(nl);
          if (numSharedConnections > 0) {
              buf.append(sharedBuf);
          }
          // Free info
          buf.append("available=");
          buf.append(numFreeConnections);
          buf.append(nl);
          if (numFreeConnections > 0) {
              buf.append(freeBuf);
          }
  
          return buf.toString();
      }