mirror of
https://github.com/ChronosX88/KademliaDHT.git
synced 2024-11-23 02:32:20 +00:00
3e236f4d17
Out KadContent interface also now specifies a set of methods to force it's subclasses to do their own toByte conversions
84 lines
2.4 KiB
Java
84 lines
2.4 KiB
Java
package kademlia.operation;
|
|
|
|
import java.io.IOException;
|
|
import java.util.List;
|
|
import kademlia.core.KadConfiguration;
|
|
import kademlia.core.KadServer;
|
|
import kademlia.dht.DHT;
|
|
import kademlia.dht.KadContent;
|
|
import kademlia.dht.StorageEntry;
|
|
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;
|
|
private final KadContent content;
|
|
private final DHT localDht;
|
|
private final KadConfiguration config;
|
|
|
|
/**
|
|
* @param server
|
|
* @param localNode
|
|
* @param content The content to be stored on the DHT
|
|
* @param localDht The local DHT
|
|
* @param config
|
|
*/
|
|
public StoreOperation(KadServer server, Node localNode, KadContent content, DHT localDht, KadConfiguration config)
|
|
{
|
|
this.server = server;
|
|
this.localNode = localNode;
|
|
this.content = content;
|
|
this.localDht = localDht;
|
|
this.config = config;
|
|
}
|
|
|
|
@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(), this.config);
|
|
ndlo.execute();
|
|
List<Node> nodes = ndlo.getClosestNodes();
|
|
|
|
/* Create the message */
|
|
Message msg = new StoreContentMessage(this.localNode, new StorageEntry(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);
|
|
}
|
|
else
|
|
{
|
|
/**
|
|
* @todo Create a receiver that receives a store acknowledgement message to count how many nodes a content have been stored at
|
|
*/
|
|
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;
|
|
}
|
|
}
|