docs: public int discriminate(VirtualConnection vc, Object discrimData) {
          if (tc.isEntryEnabled())
              SibTr.entry(this, tc, "discriminate", new Object[]
              {
               vc, discrimData
              });
  
          int answer;
          // begin D218910
          WsByteBuffer[] dataArray = (WsByteBuffer[]) discrimData;
  
          // begin D234423
          if (dataArray == null) {
              if (tc.isDebugEnabled())
                  SibTr.debug(this, tc, "timeout prior to discrimination.");
              answer = MAYBE;
          } else {
              WsByteBuffer data = null;
              int originalPosition = 0;
              int originalLimit = 0;
              switch (dataArray.length) {
                  case 0:
                      if (tc.isDebugEnabled())
                          SibTr.debug(this, tc, "discriminate", "MAYBE");
                      if (tc.isEntryEnabled())
                          SibTr.exit(this, tc, "discriminate");
                      return MAYBE;
                  case 1:
                      originalPosition = dataArray[0].position();
                      originalLimit = dataArray[0].limit();
                      data = dataArray[0].flip();
                      break;
                  default:
                      int totalAmount = 0;
                      for (int i = 0; i < dataArray.length; ++i) {
                          totalAmount += dataArray[i].position();
                      }
                      data = CommsServerServiceFacade.getBufferPoolManager().allocate(totalAmount);
                      for (int i = 0; i < dataArray.length; ++i) {
                          originalPosition = dataArray[i].position();
                          originalLimit = dataArray[i].limit();
                          dataArray[i].flip();
                          data.put(dataArray[i]);
                          dataArray[i].position(originalPosition);
                          dataArray[i].limit(originalLimit);
                      }
                      data.flip();
                      break;
              }
              // end D218910
  
              if (tc.isDebugEnabled()) {
                  byte[] debugData = null;
                  int start = 0;
  
                  if (data.hasArray()) {
                      debugData = data.array();
                      start = data.arrayOffset() + data.position();;
                  } else {
                      debugData = new byte[32];
                      int pos = data.position();
                      data.get(debugData);
                      data.position(pos);
                      start = 0;
                  }
  
                  SibTr.bytes(this, tc, debugData, start, 32, "Discrimination Data");
              }
  
              if (data.remaining() < EYECATCHER.length) {
                  // Not enought data to tell for sure - but maybe enough to eliminate ourself
                  answer = MAYBE;
                  for (int i = 0; (data.remaining() > 0) && (answer == MAYBE); ++i) {
                      if (data.get() != EYECATCHER[i])
                          answer = NO;
                  }
              } else {
                  // Enough data to be able to decide if this is ours or not.
                  answer = YES;
                  for (int i = 0; (i < EYECATCHER.length) && (answer == YES); ++i) {
                      if (data.get() != EYECATCHER[i])
                          answer = NO;
                  }
              }
  
              data.position(originalPosition); // D218910
              data.limit(originalLimit); // D218910
          }
          // end D234423
  
          if (tc.isDebugEnabled()) {
              switch (answer) {
                  case (YES):
                      SibTr.debug(this, tc, "discriminate", "YES");
                      break;
                  case (NO):
                      SibTr.debug(this, tc, "discriminate", "NO");
                      break;
                  case (MAYBE):
                      SibTr.debug(this, tc, "discriminate", "MAYBE");
                      break;
              }
          }
          if (tc.isEntryEnabled())
              SibTr.exit(this, tc, "discriminate");
          return answer;
      }