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) );
}