public int compare()

in streams-util/src/main/java/org/apache/streams/util/schema/SchemaStoreImpl.java [330:402]


  public int compare(Schema left, Schema right) {
    // are they the same?
    if ( left.equals(right)) {
      return 0;
    }
    // is one an ancestor of the other
    Schema candidateAncestor = left;
    while ( candidateAncestor.getParent() != null ) {
      candidateAncestor = candidateAncestor.getParent();
      if ( candidateAncestor.equals(right)) {
        return 1;
      }
    }
    candidateAncestor = right;
    while ( candidateAncestor.getParent() != null ) {
      candidateAncestor = candidateAncestor.getParent();
      if ( candidateAncestor.equals(left)) {
        return -1;
      }
    }
    // does one have a field that reference the other?
    for ( JsonNode refNode : left.getContent().findValues("$ref") ) {
      String refText = refNode.asText();
      Optional<URI> resolvedUri = safeResolve(left.getUri(), refText);
      if ( resolvedUri.isPresent() && resolvedUri.get().equals(right.getUri())) {
        return 1;
      }
    }
    for ( JsonNode refNode : right.getContent().findValues("$ref") ) {
      String refText = refNode.asText();
      Optional<URI> resolvedUri = safeResolve(right.getUri(), refText);
      if ( resolvedUri.isPresent() && resolvedUri.get().equals(left.getUri())) {
        return -1;
      }
    }
    // does one have a field that reference a third schema that references the other?
    for ( JsonNode refNode : left.getContent().findValues("$ref") ) {
      String refText = refNode.asText();
      Optional<URI> possibleConnectorUri = safeResolve(left.getUri(), refText);
      if ( possibleConnectorUri.isPresent()) {
        Optional<Schema> possibleConnector = getByUri(possibleConnectorUri.get());
        if (possibleConnector.isPresent()) {
          for (JsonNode connectorRefNode : possibleConnector.get().getContent().findValues("$ref")) {
            String connectorRefText = connectorRefNode.asText();
            Optional<URI> resolvedUri = safeResolve(possibleConnector.get().getUri(), connectorRefText);
            if (resolvedUri.isPresent() && resolvedUri.get().equals(right.getUri())) {
              return 1;
            }
          }
        }
      }
    }
    for ( JsonNode refNode : right.getContent().findValues("$ref") ) {
      String refText = refNode.asText();
      Optional<URI> possibleConnectorUri = safeResolve(right.getUri(), refText);
      if ( possibleConnectorUri.isPresent()) {
        Optional<Schema> possibleConnector = getByUri(possibleConnectorUri.get());
        if (possibleConnector.isPresent()) {
          for (JsonNode connectorRefNode : possibleConnector.get().getContent().findValues("$ref")) {
            String connectorRefText = connectorRefNode.asText();
            Optional<URI> resolvedUri = safeResolve(possibleConnector.get().getUri(), connectorRefText);
            if (resolvedUri.isPresent() && resolvedUri.get().equals(left.getUri())) {
              return -1;
            }
          }
        }
      }
    }
    // there still has to be some order even when there are no connections.
    // we'll arbitrarily pick alphabetic by ID
    int lexigraphic = right.toString().compareTo(left.toString());
    return ( lexigraphic / Math.abs(lexigraphic) );
  }