/*
* 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.db;
import java.io.Serializable;
import org.limewire.mojito.KUID;
import org.limewire.mojito.MojitoDHT;
import org.limewire.mojito.routing.Contact;
/**
* A <code>DHTValueEntity</code> is a row in a {@link Database}.
*/
public class DHTValueEntity implements Serializable {
private static final long serialVersionUID = 2007158043378144871L;
/**
* The creator of the value.
*/
private final Contact creator;
/**
* The sender of the value (store forward).
*/
private final Contact sender;
/**
* The (primary) key of the value.
*/
private final KUID primaryKey;
/**
* The secondary key of the value.
*/
private final KUID secondaryKey;
/**
* The actual value.
*/
private final DHTValue value;
/**
* The time when this value was created (local time).
*/
private final long creationTime = System.currentTimeMillis();
/**
* Flag for whether or not this is a local entity
* (i.e. Sender and Creator are both the local Node).
*/
private final boolean local;
/**
* The hash code of this entity.
*/
private final int hashCode;
/**
* Creates and returns a <code>DHTValueEntity</code> from a <code>Storable</code>.
*/
public static DHTValueEntity createFromStorable(MojitoDHT mojitoDHT, Storable storable) {
return new DHTValueEntity(mojitoDHT.getLocalNode(), mojitoDHT.getLocalNode(),
storable.getPrimaryKey(), storable.getValue(), true);
}
/**
* Creates and returns a <code>DHTValueEntity</code> for the given primary
* key and value.
*/
public static DHTValueEntity createFromValue(MojitoDHT mojitoDHT, KUID primaryKey, DHTValue value) {
return new DHTValueEntity(mojitoDHT.getLocalNode(), mojitoDHT.getLocalNode(),
primaryKey, value, true);
}
/**
* Creates and returns a <code>DHTValueEntity</code> from arguments that were created.
*/
public static DHTValueEntity createFromRemote(Contact creator, Contact sender,
KUID primaryKey, DHTValue value) {
return new DHTValueEntity(creator, sender, primaryKey, value, false);
}
/**
* Constructor to create DHTValueEntities. It's package private
* for testing purposes. Use the factory methods!
*/
DHTValueEntity(Contact creator, Contact sender,
KUID primaryKey, DHTValue value, boolean local) {
this.creator = creator;
this.sender = sender;
this.primaryKey = primaryKey;
this.secondaryKey = creator.getNodeID();
this.value = value;
this.local = local;
this.hashCode = 17*primaryKey.hashCode() + secondaryKey.hashCode();
}
/**
* Returns the creator of this value.
*/
public Contact getCreator() {
return creator;
}
/**
* Returns the sender of this value.
*/
public Contact getSender() {
return sender;
}
/**
* Returns the primary key of this value.
*/
public KUID getPrimaryKey() {
return primaryKey;
}
/**
* Returns the secondary key of this value.
*/
public KUID getSecondaryKey() {
return secondaryKey;
}
/**
* Returns the value.
*/
public DHTValue getValue() {
return value;
}
/**
* Returns the creation time.
*/
public long getCreationTime() {
return creationTime;
}
/*public void handleStoreResult(StoreResult result) {
// DO NOTHING
}*/
/**
* Returns <code>true</code> if this entity was sent by
* the creator of the value. In other words
* if the creator and sender are equal.
*/
public boolean isDirect() {
return creator.equals(sender);
}
public boolean isLocalValue() {
return local;
}
/*
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return hashCode;
}
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof DHTValueEntity)) {
return false;
}
DHTValueEntity other = (DHTValueEntity)o;
return primaryKey.equals(other.getPrimaryKey())
&& secondaryKey.equals(other.getSecondaryKey());
}
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder buffer = new StringBuilder();
buffer.append("Creator: ").append(getCreator()).append("\n");
buffer.append("Sender: ").append(getSender()).append("\n");
buffer.append("Primary Key: ").append(getPrimaryKey()).append("\n");
buffer.append("Secondary Key: ").append(getSecondaryKey()).append("\n");
buffer.append("Creation time: ").append(getCreationTime()).append("\n");
buffer.append("---\n").append(getValue()).append("\n");
return buffer.toString();
}
}