/*
* 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;
import org.limewire.mojito.db.DHTValueType;
import org.limewire.mojito.routing.Contact;
/**
* An EntityKey specifies the exact location of a DHTValueEntity.
*/
public class EntityKey {
/**
* The Contact that has the Entity.
*/
private final Contact node;
/**
* The primary key of the entity.
*/
private final KUID primaryKey;
/**
* The secondary key of the entity.
*/
private final KUID secondaryKey;
/**
* The type of the entity.
*/
private final DHTValueType valueType;
private final int hashCode;
/**
* Creates and returns an EntityKey that will do a full lookup
* for the value.
*/
public static EntityKey createEntityKey(KUID primaryKey, DHTValueType valueType) {
if (primaryKey == null) {
throw new NullPointerException("PrimaryKey is null");
}
if (valueType == null) {
throw new NullPointerException("DHTValueType is null");
}
return new EntityKey(null, primaryKey, null, valueType);
}
/**
* Creates and returns a new EntityKey with a known source
* which will look only at the given Node for the value.
*/
public static EntityKey createEntityKey(Contact node, KUID primaryKey,
KUID secondaryKey, DHTValueType valueType) {
if (node == null) {
throw new NullPointerException("Contact is null");
}
if (primaryKey == null) {
throw new NullPointerException("PrimaryKey is null");
}
if (secondaryKey == null) {
throw new NullPointerException("SecondaryKey is null");
}
if (valueType == null) {
throw new NullPointerException("DHTValueType is null");
}
return new EntityKey(node, primaryKey, secondaryKey, valueType);
}
private EntityKey(Contact node, KUID primaryKey,
KUID secondaryKey, DHTValueType valueType) {
this.node = node;
this.primaryKey = primaryKey;
this.secondaryKey = secondaryKey;
this.valueType = valueType;
int hashCode = primaryKey.hashCode()
^ valueType.hashCode();
if (secondaryKey != null) {
hashCode ^= secondaryKey.hashCode();
}
this.hashCode = hashCode;
}
/**
* Returns true if this is a lookup key.
*/
public boolean isLookupKey() {
return secondaryKey == null;
}
/**
* Returns the node that has the DHTValueEntity.
*/
public Contact getContact() {
return node;
}
/**
* Returns the primary key of the DHTValueEntity.
*/
public KUID getPrimaryKey() {
return primaryKey;
}
/**
* Returns the secondary key of the DHTValueEntity.
*/
public KUID getSecondaryKey() {
return secondaryKey;
}
/**
* Returns the type of the DHTValueEntity.
*/
public DHTValueType getDHTValueType() {
return valueType;
}
@Override
public int hashCode() {
return hashCode;
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof EntityKey)) {
return false;
}
EntityKey other = (EntityKey)o;
if (isLookupKey() != other.isLookupKey()) {
return false;
}
if (isLookupKey()) {
return primaryKey.equals(other.primaryKey)
&& valueType.equals(other.valueType);
} else {
return primaryKey.equals(other.primaryKey)
&& secondaryKey.equals(other.secondaryKey)
&& valueType.equals(other.valueType);
}
}
@Override
public String toString() {
StringBuilder buffer = new StringBuilder();
buffer.append("Contact: ").append(getContact()).append("\n");
buffer.append("PrimaryKey: ").append(getPrimaryKey()).append("\n");
buffer.append("SecondaryKey: ").append(getSecondaryKey()).append("\n");
buffer.append("DHTValueType: ").append(getDHTValueType()).append("\n");
buffer.append("IsLookupKey: ").append(isLookupKey()).append("\n");
return buffer.toString();
}
}