// Path: src/dosna/content/DOSNAContent.java
// public abstract class DOSNAContent implements KadContent, ActorRelatedContent, Serializable
// {
// 
//     public static final String TYPE = "DOSNAContent";
// 
//     public final long createTs;
//     public long updateTs;
// 
//     /* Set of actors related to this content */
//     Map<String, String> relatedActors;
// 
//     
//     {
//         this.createTs = this.updateTs = System.currentTimeMillis() / 1000L;
//         relatedActors = new HashMap<>();
//     }
// 
//     public DOSNAContent()
//     {
// 
//     }
// 
//     @Override
//     public long getCreatedTimestamp()
//     {
//         return this.createTs;
//     }
// 
//     @Override
//     public long getLastUpdatedTimestamp()
//     {
//         return this.updateTs;
//     }
// 
//     @Override
//     public byte[] toSerializedForm()
//     {
//         Gson gson = new Gson();
// //        try (
// //                ByteArrayOutputStream bout = new ByteArrayOutputStream();
// //                ObjectOutputStream out = new ObjectOutputStream(bout))
// //        {
// //            out.writeObject(this);
// //            out.close();
// //            return bout.toByteArray();
// //        }
// //        catch (IOException ex)
// //        {
// //            ex.printStackTrace();
// //        }
// 
//         return gson.toJson(this).getBytes();
//     }
// 
//     @Override
//     public DOSNAContent fromSerializedForm(byte[] data)
//     {
// //        try (ByteArrayInputStream bin = new ByteArrayInputStream(data);
// //                ObjectInputStream oin = new ObjectInputStream(bin))
// //        {
// //            DOSNAContent val = (DOSNAContent) oin.readObject();
// //            oin.close();
// //            System.out.println("Deserialized: " + val);
// //            return val;
// //        }
// //        catch (IOException | ClassNotFoundException ex)
// //        {
// //            ex.printStackTrace();
// //        }
//         Gson gson = new Gson();
//         DOSNAContent val = gson.fromJson(new String(data), this.getClass());
//         return val;
//     }
// 
//     /**
//      * When some updates have been made to a content,
//      * this method can be called to update the lastUpdated timestamp.
//      */
//     public void setUpdated()
//     {
//         this.updateTs = System.currentTimeMillis() / 1000L;
//     }
// 
//     /**
//      * When adding an actor we store the actor's ID and the actor's relationship to this content
//      */
//     @Override
//     public void addActor(String userId, String relationship)
//     {
//         this.relatedActors.put(userId, relationship);
//     }
// 
//     @Override
//     public void addActor(Actor a, String relationship)
//     {
//         addActor(a.getId(), relationship);
//     }
// 
//     @Override
//     public List<String> getRelatedActors()
//     {
//         return new ArrayList<>(this.relatedActors.keySet());
//     }
// 
//     @Override
//     public String toString()
//     {
//         StringBuilder sb = new StringBuilder(this.getType());
// 
//         sb.append(": ");
// 
//         sb.append("[Actors: ");
// 
//         for (String a : this.relatedActors.keySet())
//         {
//             sb.append(a);
//             sb.append("; ");
//         }
// 
//         sb.append("]");
// 
//         return sb.toString();
//     }
// }
// 
// Path: src/dosna/DOSNAConfig.java
// public class DOSNAConfig
// {
// 
//     /**
//      * @return The Kademlia node that serves as the bootstrap node for the network
//      *
//      * @throws java.net.UnknownHostException
//      */
//     public Node getBootstrapNode() throws UnknownHostException
//     {
//         return new Node(new KademliaId("BOOTSTRAPBOOTSTRAPBO"), InetAddress.getLocalHost(), 15049);
//     }
// }


import dosna.content.DOSNAContent;
import dosna.DOSNAConfig;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.NoSuchElementException;
import kademlia.dht.GetParameter;
import kademlia.JKademliaNode;
import kademlia.dht.KademliaStorageEntry;
import kademlia.exceptions.ContentNotFoundException;
import kademlia.node.KademliaId;
package dosna.dhtAbstraction;


/**
 * An implementation of the DataManager for this Application.
 * We use the Kademlia routing protocol here.
 *
 * @author Joshua Kissoon
 * @since 20140326
 */
public final class DosnaDataManager implements DataManager
{

    /**
     * The Kademlia instance to be used.
     * We use composition rather than inheritance.
     */
    private final JKademliaNode kad;

    /**
     * Initialize Kademlia
     *
     * @param ownerId
     * @param nodeId  The NodeId to be used for this Kademlia instance
     * @param port
     *
     * @throws java.io.IOException
     * @throws java.net.UnknownHostException
     * @todo Try loading data from file, if no file exist, then create a new Kademlia instance
     */
    public DosnaDataManager(final String ownerId, final KademliaId nodeId, final int port) throws IOException, UnknownHostException
    {
        kad = new JKademliaNode(ownerId, nodeId, port);
// Path: src/dosna/content/DOSNAContent.java
// public abstract class DOSNAContent implements KadContent, ActorRelatedContent, Serializable
// {
// 
//     public static final String TYPE = "DOSNAContent";
// 
//     public final long createTs;
//     public long updateTs;
// 
//     /* Set of actors related to this content */
//     Map<String, String> relatedActors;
// 
//     
//     {
//         this.createTs = this.updateTs = System.currentTimeMillis() / 1000L;
//         relatedActors = new HashMap<>();
//     }
// 
//     public DOSNAContent()
//     {
// 
//     }
// 
//     @Override
//     public long getCreatedTimestamp()
//     {
//         return this.createTs;
//     }
// 
//     @Override
//     public long getLastUpdatedTimestamp()
//     {
//         return this.updateTs;
//     }
// 
//     @Override
//     public byte[] toSerializedForm()
//     {
//         Gson gson = new Gson();
// //        try (
// //                ByteArrayOutputStream bout = new ByteArrayOutputStream();
// //                ObjectOutputStream out = new ObjectOutputStream(bout))
// //        {
// //            out.writeObject(this);
// //            out.close();
// //            return bout.toByteArray();
// //        }
// //        catch (IOException ex)
// //        {
// //            ex.printStackTrace();
// //        }
// 
//         return gson.toJson(this).getBytes();
//     }
// 
//     @Override
//     public DOSNAContent fromSerializedForm(byte[] data)
//     {
// //        try (ByteArrayInputStream bin = new ByteArrayInputStream(data);
// //                ObjectInputStream oin = new ObjectInputStream(bin))
// //        {
// //            DOSNAContent val = (DOSNAContent) oin.readObject();
// //            oin.close();
// //            System.out.println("Deserialized: " + val);
// //            return val;
// //        }
// //        catch (IOException | ClassNotFoundException ex)
// //        {
// //            ex.printStackTrace();
// //        }
//         Gson gson = new Gson();
//         DOSNAContent val = gson.fromJson(new String(data), this.getClass());
//         return val;
//     }
// 
//     /**
//      * When some updates have been made to a content,
//      * this method can be called to update the lastUpdated timestamp.
//      */
//     public void setUpdated()
//     {
//         this.updateTs = System.currentTimeMillis() / 1000L;
//     }
// 
//     /**
//      * When adding an actor we store the actor's ID and the actor's relationship to this content
//      */
//     @Override
//     public void addActor(String userId, String relationship)
//     {
//         this.relatedActors.put(userId, relationship);
//     }
// 
//     @Override
//     public void addActor(Actor a, String relationship)
//     {
//         addActor(a.getId(), relationship);
//     }
// 
//     @Override
//     public List<String> getRelatedActors()
//     {
//         return new ArrayList<>(this.relatedActors.keySet());
//     }
// 
//     @Override
//     public String toString()
//     {
//         StringBuilder sb = new StringBuilder(this.getType());
// 
//         sb.append(": ");
// 
//         sb.append("[Actors: ");
// 
//         for (String a : this.relatedActors.keySet())
//         {
//             sb.append(a);
//             sb.append("; ");
//         }
// 
//         sb.append("]");
// 
//         return sb.toString();
//     }
// }
// 
// Path: src/dosna/DOSNAConfig.java
// public class DOSNAConfig
// {
// 
//     /**
//      * @return The Kademlia node that serves as the bootstrap node for the network
//      *
//      * @throws java.net.UnknownHostException
//      */
//     public Node getBootstrapNode() throws UnknownHostException
//     {
//         return new Node(new KademliaId("BOOTSTRAPBOOTSTRAPBO"), InetAddress.getLocalHost(), 15049);
//     }
// }


// Path: src/dosna/dhtAbstraction/DosnaDataManager.java
import dosna.content.DOSNAContent;
import dosna.DOSNAConfig;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.NoSuchElementException;
import kademlia.dht.GetParameter;
import kademlia.JKademliaNode;
import kademlia.dht.KademliaStorageEntry;
import kademlia.exceptions.ContentNotFoundException;
import kademlia.node.KademliaId;

package dosna.dhtAbstraction;


/**
 * An implementation of the DataManager for this Application.
 * We use the Kademlia routing protocol here.
 *
 * @author Joshua Kissoon
 * @since 20140326
 */
public final class DosnaDataManager implements DataManager
{

    /**
     * The Kademlia instance to be used.
     * We use composition rather than inheritance.
     */
    private final JKademliaNode kad;

    /**
     * Initialize Kademlia
     *
     * @param ownerId
     * @param nodeId  The NodeId to be used for this Kademlia instance
     * @param port
     *
     * @throws java.io.IOException
     * @throws java.net.UnknownHostException
     * @todo Try loading data from file, if no file exist, then create a new Kademlia instance
     */
    public DosnaDataManager(final String ownerId, final KademliaId nodeId, final int port) throws IOException, UnknownHostException
    {
        kad = new JKademliaNode(ownerId, nodeId, port);
        kad.bootstrap(new DOSNAConfig().getBootstrapNode());