docs: public boolean compareTrees(Object[][] mxMessageHeader, Object[][] mxMessageFilter, boolean bFullTree)
      {
          if (mxMessageHeader == null)
              mxMessageHeader = EMPTY_MATRIX;
          if (mxMessageFilter == null)
              mxMessageFilter = EMPTY_MATRIX;
          if (mxMessageFilter.length != mxMessageHeader.length)
              if (bFullTree)
                  return false;    // Different sizes = unequal
          if (mxMessageFilter.length > mxMessageHeader.length)
              return false;    // Not enough entries in the header = unequal
          for (int iIndex = 0; iIndex < mxMessageFilter.length; iIndex++)
          {
              String strHeaderKey = (String)mxMessageHeader[iIndex][0];
              Object objHeaderValue = mxMessageHeader[iIndex][1];
              String strFilterKey = (String)mxMessageFilter[iIndex][0];
              Object objFilterValue = mxMessageFilter[iIndex][1];
              if ((strHeaderKey == strFilterKey)
                  && (objHeaderValue == objFilterValue))
                      continue;   // Match so far
              if (((strHeaderKey != null)
                  && (strHeaderKey.equalsIgnoreCase(strFilterKey)))
                      && ((objHeaderValue != null)
                          && (objHeaderValue.equals(objFilterValue))))
                              continue;   // Match so far
              return false;   // No match
          }
          return true;    // Equal.
      }