/*************************GO-LICENSE-START********************************* * Copyright 2014 ThoughtWorks, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *************************GO-LICENSE-END***********************************/ package com.thoughtworks.go.domain; import org.apache.commons.lang.StringUtils; import java.net.InetAddress; import java.net.UnknownHostException; /** * @understands the network address for a machine */ public class IpAddress implements Comparable<IpAddress> { private InetAddress address; public IpAddress(InetAddress address) { this.address = address; } public static IpAddress create(String address) { try { if (StringUtils.isEmpty(address)) { return new NullIpAddress(); } return new IpAddress(InetAddress.getByName(address)); } catch (UnknownHostException e) { throw new RuntimeException("IpAddress '" + address + "' is not a valid IP address"); } } public String toString() { return address.getHostAddress(); } public int compareTo(IpAddress other) { byte[] myAddressInBytes = address.getAddress(); byte[] otherAddresInBytes = other.address.getAddress(); // general ordering: ipv4 before ipv6 if (myAddressInBytes.length < otherAddresInBytes.length) return -1; if (myAddressInBytes.length > otherAddresInBytes.length) return 1; // we have 2 ips of the same type, so we have to compare each byte for (int i = 0; i < myAddressInBytes.length; i++) { int b1 = unsignedByteToInt(myAddressInBytes[i]); int b2 = unsignedByteToInt(otherAddresInBytes[i]); if (b1 == b2) continue; if (b1 < b2) return -1; else return 1; } return 0; } private int unsignedByteToInt(byte b) { return (int) b & 0xFF; } private static class NullIpAddress extends IpAddress { public NullIpAddress() throws UnknownHostException { super(InetAddress.getByName("0.0.0.0")); } public String toString() { return ""; } public int compareTo(IpAddress other) { return -1; } } }