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