1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 2003-2004 Brian Wellington (bwelling@xbill.org) 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS; 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Helper functions for doing serial arithmetic. These should be used when 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * setting/checking SOA serial numbers. SOA serial number arithmetic is 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * defined in RFC 1982. 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic final class Serial { 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final long MAX32 = 0xFFFFFFFFL; 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenSerial() { 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Compares two numbers using serial arithmetic. The numbers are assumed 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * to be 32 bit unsigned integers stored in longs. 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param serial1 The first integer 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param serial2 The second integer 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return 0 if the 2 numbers are equal, a positive number if serial1 is greater 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * than serial2, and a negative number if serial2 is greater than serial1. 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws IllegalArgumentException serial1 or serial2 is out of range 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static int 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chencompare(long serial1, long serial2) { 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (serial1 < 0 || serial1 > MAX32) 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException(serial1 + " out of range"); 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (serial2 < 0 || serial2 > MAX32) 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException(serial2 + " out of range"); 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen long diff = serial1 - serial2; 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (diff >= MAX32) 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen diff -= (MAX32 + 1); 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else if (diff < -MAX32) 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen diff += (MAX32 + 1); 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return (int)diff; 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Increments a serial number. The number is assumed to be a 32 bit unsigned 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * integer stored in a long. This basically adds 1 and resets the value to 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 0 if it is 2^32. 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param serial The serial number 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return The incremented serial number 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws IllegalArgumentException serial is out of range 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic static long 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenincrement(long serial) { 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (serial < 0 || serial > MAX32) 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException(serial + " out of range"); 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (serial == MAX32) 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return 0; 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return serial + 1; 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 62