package com.netflix.discovery.util; import java.util.List; import java.util.Map; import com.netflix.appinfo.AmazonInfo; import com.netflix.appinfo.DataCenterInfo; import com.netflix.appinfo.InstanceInfo; import com.netflix.appinfo.LeaseInfo; import com.netflix.discovery.shared.Application; import com.netflix.discovery.shared.Applications; /** * For test use. * * @author Tomasz Bak */ public final class EurekaEntityComparators { private EurekaEntityComparators() { } public static boolean equal(DataCenterInfo first, DataCenterInfo second) { if (first == second) { return true; } if (first == null || first == null && second != null) { return false; } if (first.getClass() != second.getClass()) { return false; } if (first instanceof AmazonInfo) { return equal((AmazonInfo) first, (AmazonInfo) second); } return first.getName() == second.getName(); } public static boolean equal(AmazonInfo first, AmazonInfo second) { if (first == second) { return true; } if (first == null || first == null && second != null) { return false; } return first.getMetadata().equals(second.getMetadata()); } public static boolean subsetOf(DataCenterInfo first, DataCenterInfo second) { if (first == second) { return true; } if (first == null || first == null && second != null) { return false; } if (first.getClass() != second.getClass()) { return false; } if (first instanceof AmazonInfo) { return subsetOf((AmazonInfo) first, (AmazonInfo) second); } return first.getName() == second.getName(); } public static boolean subsetOf(AmazonInfo first, AmazonInfo second) { if (first == second) { return true; } if (first == null || first == null && second != null) { return false; } return first.getMetadata().entrySet().containsAll(second.getMetadata().entrySet()); } public static boolean equal(LeaseInfo first, LeaseInfo second) { if (first == second) { return true; } if (first == null || first == null && second != null) { return false; } if (first.getDurationInSecs() != second.getDurationInSecs()) { return false; } if (first.getEvictionTimestamp() != second.getEvictionTimestamp()) { return false; } if (first.getRegistrationTimestamp() != second.getRegistrationTimestamp()) { return false; } if (first.getRenewalIntervalInSecs() != second.getRenewalIntervalInSecs()) { return false; } if (first.getRenewalTimestamp() != second.getRenewalTimestamp()) { return false; } if (first.getServiceUpTimestamp() != second.getServiceUpTimestamp()) { return false; } return true; } public static boolean equal(InstanceInfo first, InstanceInfo second) { return equal(first, second, new ResolvedIdEqualFunc()); } public static boolean equal(InstanceInfo first, InstanceInfo second, EqualFunc<InstanceInfo> idEqualFunc) { if (first == second) { return true; } if (first == null || first == null && second != null) { return false; } if (first.getCountryId() != second.getCountryId()) { return false; } if (first.getPort() != second.getPort()) { return false; } if (first.getSecurePort() != second.getSecurePort()) { return false; } if (first.getActionType() != second.getActionType()) { return false; } if (first.getAppGroupName() != null ? !first.getAppGroupName().equals(second.getAppGroupName()) : second.getAppGroupName() != null) { return false; } if (!idEqualFunc.equals(first, second)) { return false; } if (first.getSID() != null ? !first.getSID().equals(second.getSID()) : second.getSID() != null) { return false; } if (first.getAppName() != null ? !first.getAppName().equals(second.getAppName()) : second.getAppName() != null) { return false; } if (first.getASGName() != null ? !first.getASGName().equals(second.getASGName()) : second.getASGName() != null) { return false; } if (!equal(first.getDataCenterInfo(), second.getDataCenterInfo())) { return false; } if (first.getHealthCheckUrls() != null ? !first.getHealthCheckUrls().equals(second.getHealthCheckUrls()) : second.getHealthCheckUrls() != null) { return false; } if (first.getHomePageUrl() != null ? !first.getHomePageUrl().equals(second.getHomePageUrl()) : second.getHomePageUrl() != null) { return false; } if (first.getHostName() != null ? !first.getHostName().equals(second.getHostName()) : second.getHostName() != null) { return false; } if (first.getIPAddr() != null ? !first.getIPAddr().equals(second.getIPAddr()) : second.getIPAddr() != null) { return false; } if (!equal(first.getLeaseInfo(), second.getLeaseInfo())) { return false; } if (!equal(first.getMetadata(), second.getMetadata())) { return false; } if (first.getHealthCheckUrls() != null ? !first.getHealthCheckUrls().equals(second.getHealthCheckUrls()) : second.getHealthCheckUrls() != null) { return false; } if (first.getVIPAddress() != null ? !first.getVIPAddress().equals(second.getVIPAddress()) : second.getVIPAddress() != null) { return false; } if (first.getSecureVipAddress() != null ? !first.getSecureVipAddress().equals(second.getSecureVipAddress()) : second.getSecureVipAddress() != null) { return false; } if (first.getStatus() != null ? !first.getStatus().equals(second.getStatus()) : second.getStatus() != null) { return false; } if (first.getStatusPageUrl() != null ? !first.getStatusPageUrl().equals(second.getStatusPageUrl()) : second.getStatusPageUrl() != null) { return false; } if (first.getLastDirtyTimestamp() != null ? !first.getLastDirtyTimestamp().equals(second.getLastDirtyTimestamp()) : second.getLastDirtyTimestamp() != null) { return false; } if (first.getLastUpdatedTimestamp()!= second.getLastUpdatedTimestamp()) { return false; } if (first.isCoordinatingDiscoveryServer() != null ? !first.isCoordinatingDiscoveryServer().equals(second.isCoordinatingDiscoveryServer()) : second.isCoordinatingDiscoveryServer() != null) { return false; } return true; } private static boolean idEqual(InstanceInfo first, InstanceInfo second) { return first.getId().equals(second.getId()); } public static boolean equalMini(InstanceInfo first, InstanceInfo second) { if (first == second) { return true; } if (first == null || first == null && second != null) { return false; } if (first.getPort() != second.getPort()) { return false; } if (first.getSecurePort() != second.getSecurePort()) { return false; } if (first.getActionType() != second.getActionType()) { return false; } if (first.getInstanceId() != null ? !first.getInstanceId().equals(second.getInstanceId()) : second.getInstanceId() != null) { return false; } if (first.getAppName() != null ? !first.getAppName().equals(second.getAppName()) : second.getAppName() != null) { return false; } if (first.getASGName() != null ? !first.getASGName().equals(second.getASGName()) : second.getASGName() != null) { return false; } if (!subsetOf(first.getDataCenterInfo(), second.getDataCenterInfo())) { return false; } if (first.getHostName() != null ? !first.getHostName().equals(second.getHostName()) : second.getHostName() != null) { return false; } if (first.getIPAddr() != null ? !first.getIPAddr().equals(second.getIPAddr()) : second.getIPAddr() != null) { return false; } if (first.getVIPAddress() != null ? !first.getVIPAddress().equals(second.getVIPAddress()) : second.getVIPAddress() != null) { return false; } if (first.getSecureVipAddress() != null ? !first.getSecureVipAddress().equals(second.getSecureVipAddress()) : second.getSecureVipAddress() != null) { return false; } if (first.getStatus() != null ? !first.getStatus().equals(second.getStatus()) : second.getStatus() != null) { return false; } if (first.getLastUpdatedTimestamp()!= second.getLastUpdatedTimestamp()) { return false; } return true; } public static boolean equal(Application first, Application second) { if (first == second) { return true; } if (first == null || first == null && second != null) { return false; } if (first.getName() != null ? !first.getName().equals(second.getName()) : second.getName() != null) { return false; } List<InstanceInfo> firstInstanceInfos = first.getInstances(); List<InstanceInfo> secondInstanceInfos = second.getInstances(); if (firstInstanceInfos == null && secondInstanceInfos == null) { return true; } if (firstInstanceInfos == null || secondInstanceInfos == null || firstInstanceInfos.size() != secondInstanceInfos.size()) { return false; } for (InstanceInfo firstInstanceInfo : firstInstanceInfos) { InstanceInfo secondInstanceInfo = second.getByInstanceId(firstInstanceInfo.getId()); if (!equal(firstInstanceInfo, secondInstanceInfo)) { return false; } } return true; } public static boolean equal(Applications first, Applications second) { if (first == second) { return true; } if (first == null || first == null && second != null) { return false; } List<Application> firstApps = first.getRegisteredApplications(); List<Application> secondApps = second.getRegisteredApplications(); if (firstApps == null && secondApps == null) { return true; } if (firstApps == null || secondApps == null || firstApps.size() != secondApps.size()) { return false; } for (Application firstApp : firstApps) { Application secondApp = second.getRegisteredApplications(firstApp.getName()); if (!equal(firstApp, secondApp)) { return false; } } return true; } private static boolean equal(Map<String, String> first, Map<String, String> second) { if (first == second) { return true; } if (first == null || first == null && second != null || first.size() != second.size()) { return false; } for (Map.Entry<String, String> entry : first.entrySet()) { if (!second.containsKey(entry.getKey())) { return false; } String firstValue = entry.getValue(); String secondValue = second.get(entry.getKey()); if (!firstValue.equals(secondValue)) { return false; } } return true; } public interface EqualFunc<T> { boolean equals(T first, T second); } public static class RawIdEqualFunc implements EqualFunc<InstanceInfo> { @Override public boolean equals(InstanceInfo first, InstanceInfo second) { return first.getInstanceId() != null ? first.getInstanceId().equals(second.getInstanceId()) : second.getInstanceId() == null; } } public static class RawIdHandleEmptyEqualFunc implements EqualFunc<InstanceInfo> { @Override public boolean equals(InstanceInfo first, InstanceInfo second) { String firstId = (first.getInstanceId() == null || first.getInstanceId().isEmpty()) ? null : first.getInstanceId(); String secondId = (second.getInstanceId() == null || second.getInstanceId().isEmpty()) ? null : second.getInstanceId(); return firstId != null ? firstId.equals(secondId) : secondId == null; } } public static class ResolvedIdEqualFunc implements EqualFunc<InstanceInfo> { @Override public boolean equals(InstanceInfo first, InstanceInfo second) { return first.getId() != null ? first.getId().equals(second.getId()) : second.getId() == null; } } }