/* * Mojito Distributed Hash Table (Mojito DHT) * Copyright (C) 2006-2007 LimeWire LLC * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.limewire.mojito.routing; import java.io.Serializable; /** * Version is a two byte value in big-endian byte order where * the first byte is the major version number and the second * byte the minor version number. */ public class Version implements Serializable, Comparable<Version> { private static final long serialVersionUID = -4652316695244961502L; /** * An array of cached Versions. Make it bigger if necessary. */ private static final Version[] VERSIONS = new Version[10]; public static final int LENGTH = 2; public static final Version ZERO = new Version(0); private final int version; private Version(int version) { this.version = version; } /** * Returns the major version. */ public int getMajor() { return (version >> 8) & 0xFF; } /** * Returns the minor version. */ public int getMinor() { return version & 0xFF; } /** * Returns the version as an unsigned short. */ public int shortValue() { return version; } @Override public int hashCode() { return version; } public int compareTo(Version o) { return version - o.version; } @Override public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Version)) { return false; } return version == ((Version)o).version; } @Override public String toString() { return getMajor() + "." + getMinor(); } /** * Returns a Version object for the given version number. */ public static synchronized Version valueOf(int version) { if ((version & 0xFFFF0000) != 0) { throw new IllegalArgumentException("Version is out of range (0x0000 - 0xFFFF): " + version); } int index = version % VERSIONS.length; Version vers = VERSIONS[index]; if (vers == null || vers.version != version) { vers = new Version(version); VERSIONS[index] = vers; } return vers; } /** * Returns a Version object for the given major and minor version number. */ public static Version valueOf(int major, int minor) { return valueOf((major << 8) | minor); } /** * Check the cache and replace this instance with the cached instance * if one exists. The main goal is to pre-initialize the VERSIONS * array. */ private Object readResolve() { synchronized (getClass()) { int index = version % VERSIONS.length; Version vers = VERSIONS[index]; if (vers == null || vers.version != version) { vers = this; VERSIONS[index] = vers; } return vers; } } }