KademliaDHT/src/kademlia/operation/StoreOperation.java

79 lines
2.1 KiB
Java
Raw Normal View History

package kademlia.operation;
import java.io.IOException;
import java.util.List;
import kademlia.core.KadServer;
import kademlia.dht.DHT;
2014-02-25 08:12:08 +00:00
import kademlia.dht.KadContent;
2014-02-25 17:27:46 +00:00
import kademlia.message.Message;
import kademlia.message.StoreContentMessage;
import kademlia.node.Node;
/**
* Operation that stores a DHT Content onto the K closest nodes to the content Key
*
* @author Joshua Kissoon
* @since 20140224
*/
public class StoreOperation implements Operation
{
private final KadServer server;
private final Node localNode;
2014-02-25 08:12:08 +00:00
private final KadContent content;
private final DHT localDht;
/**
* @param server
* @param localNode
* @param content The content to be stored on the DHT
* @param localDht The local DHT
*/
public StoreOperation(KadServer server, Node localNode, KadContent content, DHT localDht)
{
this.server = server;
this.localNode = localNode;
this.content = content;
this.localDht = localDht;
}
@Override
public synchronized void execute() throws IOException
{
/* Get the nodes on which we need to store the content */
NodeLookupOperation ndlo = new NodeLookupOperation(this.server, this.localNode, this.content.getKey());
ndlo.execute();
List<Node> nodes = ndlo.getClosestNodes();
2014-02-25 17:27:46 +00:00
/* Create the message */
Message msg = new StoreContentMessage(this.localNode, this.content);
/*Store the message on all of the K-Nodes*/
for (Node n : nodes)
{
if (n.equals(this.localNode))
{
/* Store the content locally */
this.localDht.store(content);
2014-02-25 17:27:46 +00:00
}
else
{
/**
* @todo Create a receiver that receives a store acknowledgement message to count how many nodes a content have been stored at
*/
2014-02-25 17:27:46 +00:00
this.server.sendMessage(n, msg, null);
}
}
}
/**
* @return The number of nodes that have stored this content
*
* @todo Implement this method
*/
public int numNodesStoredAt()
{
return 1;
}
}