private List<ResourceAddress> asResourceAddressList(ResourceAddress addr) { List<ResourceAddress> result = new ArrayList<>(); List<ResourceAddress> topLevelAddresses = new ArrayList<>(); ResourceAddress cursor = addr; do { topLevelAddresses.add(cursor); cursor = cursor.getOption(ResourceAddress.ALTERNATE); } while (cursor != null); //recurse for ( ResourceAddress resourceAddress: topLevelAddresses ) { ResourceAddress transport = resourceAddress.getTransport(); if ( transport != null ) { for (ResourceAddress transportAddress: asResourceAddressList(transport)) { ResourceOptions newResultOptions = ResourceOptions.FACTORY.newResourceOptions(resourceAddress); newResultOptions.setOption(TRANSPORT, transportAddress); ResourceAddress newResult = addressFactory.newResourceAddress(resourceAddress.getExternalURI(), newResultOptions); result.add(newResult); } } else { result.add(resourceAddress); } } return result; } }
@Override public int compare(ResourceAddress addr1, ResourceAddress addr2) { List<ResourceAddress> addresses1 = asResourceAddressList(addr1); List<ResourceAddress> addresses2 = asResourceAddressList(addr2); for (ResourceAddress anAddress1 : addresses1) { for (ResourceAddress anAddress2 : addresses2) { int result = delegate.compare(anAddress1, anAddress2); if (result == 0) { return result; } } } return delegate.compare(addr1, addr2); }
public static Comparator<ResourceAddress> compareAlternates(Comparator<ResourceAddress> comparator) { return compareNonNull(new AlternateResourceAddressComparator(comparator)); }