/*
* 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;
import org.limewire.mojito.util.ArrayUtils;
/**
* Vendor is a four byte value in big-endian byte order where
* each byte is chosen from the human readable ASCII character
* space.
*/
public class Vendor implements Serializable, Comparable<Vendor> {
private static final long serialVersionUID = 1607453128714814318L;
/**
* An array of cached Vendors. Make it bigger if necessary.
*/
private static final Vendor[] VENDORS = new Vendor[10];
public static final Vendor UNKNOWN = new Vendor(0);
public static final int LENGTH = 4;
private final int vendorId;
private Vendor(int vendorId) {
this.vendorId = vendorId;
}
/**
* Returns the vendor ID as an integer.
*/
public int intValue() {
return vendorId;
}
@Override
public int hashCode() {
return vendorId;
}
public int compareTo(Vendor o) {
return vendorId - o.vendorId;
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Vendor)) {
return false;
}
return vendorId == ((Vendor)o).vendorId;
}
@Override
public String toString() {
return ArrayUtils.toString(vendorId);
}
/**
* Returns a Vendor object for the given vendor ID.
*/
public static synchronized Vendor valueOf(int vendorId) {
int index = (vendorId & Integer.MAX_VALUE) % VENDORS.length;
Vendor vendor = VENDORS[index];
if (vendor == null || vendor.vendorId != vendorId) {
vendor = new Vendor(vendorId);
VENDORS[index] = vendor;
}
return vendor;
}
/**
* Returns a Vendor object for the given vendor ID.
*/
public static Vendor valueOf(String vendorId) {
return valueOf(ArrayUtils.toInteger(vendorId));
}
/**
* Check the cache and replace this instance with the cached instance
* if one exists. The main goal is to pre-initialize the VENDORS
* array.
*/
private Object readResolve() {
synchronized (getClass()) {
int index = (vendorId & Integer.MAX_VALUE) % VENDORS.length;
Vendor vendor = VENDORS[index];
if (vendor == null || vendor.vendorId != vendorId) {
vendor = this;
VENDORS[index] = vendor;
}
return vendor;
}
}
}