// Path: src/socialkademlia/dht/JSocialKademliaStorageEntry.java
// public class JSocialKademliaStorageEntry implements SocialKademliaStorageEntry
// {
// 
//     private String content;
//     private final JSocialKademliaStorageEntryMetadata metadata;
//     private boolean isCompressed;       // Is this entry in compressed form
// 
//     
//     {
//         this.isCompressed = false;
//     }
// 
//     public JSocialKademliaStorageEntry(final KadContent content)
//     {
//         this(content, new JSocialKademliaStorageEntryMetadata(content));
//     }
// 
//     public JSocialKademliaStorageEntry(final KadContent content, final JSocialKademliaStorageEntryMetadata metadata)
//     {
//         this.setContent(content.toSerializedForm());
//         this.metadata = metadata;
//     }
// 
//     @Override
//     public final void setContent(final byte[] data)
//     {
//         this.content = new String(data);
//     }
// 
//     @Override
//     public final void setContent(String data)
//     {
//         this.content = data;
//     }
// 
//     @Override
//     public final byte[] getContent()
//     {
//         return this.content.getBytes();
//     }
// 
//     @Override
//     public final String getContentString()
//     {
//         return this.content;
//     }
// 
//     @Override
//     public final SocialKademliaStorageEntryMetadata getContentMetadata()
//     {
//         return this.metadata;
//     }
// 
//     @Override
//     public boolean isCompressed()
//     {
//         return this.isCompressed;
//     }
// 
//     @Override
//     public void setCompressed()
//     {
//         this.isCompressed = true;
//     }
// 
//     @Override
//     public void setDecompressed()
//     {
//         this.isCompressed = false;
//     }
// 
//     @Override
//     public String toString()
//     {
//         StringBuilder sb = new StringBuilder("[StorageEntry: ");
// 
//         sb.append("[Content: ");
//         sb.append(this.getContent());
//         sb.append("]");
// 
//         sb.append(this.getContentMetadata());
// 
//         sb.append("]");
// 
//         return sb.toString();
//     }
// }
// 
// Path: src/socialkademlia/dht/SocialKademliaStorageEntry.java
// public interface SocialKademliaStorageEntry extends KademliaStorageEntry
// {
// 
//     /**
//      * Set the content value of this storage entry
//      *
//      * @param data
//      */
//     public void setContent(String data);
// 
//     /**
//      * @return Whether this entry is compressed or not
//      */
//     public boolean isCompressed();
// 
//     /**
//      * Specify that the storage entry is compressed
//      */
//     public void setCompressed();
// 
//     /**
//      * Specify that the storage entry is decompressed
//      */
//     public void setDecompressed();
// 
//     /**
//      * @return The content in string format
//      */
//     public String getContentString();
// 
//     @Override
//     public SocialKademliaStorageEntryMetadata getContentMetadata();
// }
// 
// Path: src/socialkademlia/util/StringCompressor.java
// public class StringCompressor
// {
// 
//     public static String compress(final byte[] input) throws IOException
//     {
//         try (ByteArrayOutputStream bout = new ByteArrayOutputStream();
//                 GZIPOutputStream gzipper = new GZIPOutputStream(bout))
//         {
//             gzipper.write(input, 0, input.length);
//             gzipper.close();
//             return Base64.getEncoder().encodeToString(bout.toByteArray());
//         }
//     }
// 
//     public static String decompress(final String input) throws IOException
//     {
//         byte[] inputBytes = Base64.getDecoder().decode(input);
// 
//         try (GZIPInputStream gzipper = new GZIPInputStream(new ByteArrayInputStream(inputBytes));
//                 BufferedReader bf = new BufferedReader(new InputStreamReader(gzipper)))
//         {
//             StringBuilder data = new StringBuilder();
//             String line;
//             while ((line = bf.readLine()) != null)
//             {
//                 data.append(line);
//             }
//             return data.toString();
//         }
//     }
// }


import java.io.IOException;
import socialkademlia.dht.JSocialKademliaStorageEntry;
import socialkademlia.dht.SocialKademliaStorageEntry;
import socialkademlia.util.StringCompressor;
package socialkademlia.dht.util;


/**
 * Class that handles compression of storage entries.
 *
 * In the storage entry, it doesn't make sense to constantly compress all of the data and decompress it,
 * so we only compress the content part.
 *
 * @author Joshua Kissoon
 * @since 20140511
 */
public class StorageEntryCompressor
{

    /**
     * Compress a given storage entry.
     *
     * We only compress the content part of the storage entry.
     *
     * @param entry The entry whose content is to be compressed
     *
     * @return The entry with compressed content
     *
     * @throws java.io.IOException
     */
    public static JSocialKademliaStorageEntry compress(final JSocialKademliaStorageEntry entry) throws IOException
    {
        if (entry.isCompressed())
        {
            return entry;
        }

        try
        {
// Path: src/socialkademlia/dht/JSocialKademliaStorageEntry.java
// public class JSocialKademliaStorageEntry implements SocialKademliaStorageEntry
// {
// 
//     private String content;
//     private final JSocialKademliaStorageEntryMetadata metadata;
//     private boolean isCompressed;       // Is this entry in compressed form
// 
//     
//     {
//         this.isCompressed = false;
//     }
// 
//     public JSocialKademliaStorageEntry(final KadContent content)
//     {
//         this(content, new JSocialKademliaStorageEntryMetadata(content));
//     }
// 
//     public JSocialKademliaStorageEntry(final KadContent content, final JSocialKademliaStorageEntryMetadata metadata)
//     {
//         this.setContent(content.toSerializedForm());
//         this.metadata = metadata;
//     }
// 
//     @Override
//     public final void setContent(final byte[] data)
//     {
//         this.content = new String(data);
//     }
// 
//     @Override
//     public final void setContent(String data)
//     {
//         this.content = data;
//     }
// 
//     @Override
//     public final byte[] getContent()
//     {
//         return this.content.getBytes();
//     }
// 
//     @Override
//     public final String getContentString()
//     {
//         return this.content;
//     }
// 
//     @Override
//     public final SocialKademliaStorageEntryMetadata getContentMetadata()
//     {
//         return this.metadata;
//     }
// 
//     @Override
//     public boolean isCompressed()
//     {
//         return this.isCompressed;
//     }
// 
//     @Override
//     public void setCompressed()
//     {
//         this.isCompressed = true;
//     }
// 
//     @Override
//     public void setDecompressed()
//     {
//         this.isCompressed = false;
//     }
// 
//     @Override
//     public String toString()
//     {
//         StringBuilder sb = new StringBuilder("[StorageEntry: ");
// 
//         sb.append("[Content: ");
//         sb.append(this.getContent());
//         sb.append("]");
// 
//         sb.append(this.getContentMetadata());
// 
//         sb.append("]");
// 
//         return sb.toString();
//     }
// }
// 
// Path: src/socialkademlia/dht/SocialKademliaStorageEntry.java
// public interface SocialKademliaStorageEntry extends KademliaStorageEntry
// {
// 
//     /**
//      * Set the content value of this storage entry
//      *
//      * @param data
//      */
//     public void setContent(String data);
// 
//     /**
//      * @return Whether this entry is compressed or not
//      */
//     public boolean isCompressed();
// 
//     /**
//      * Specify that the storage entry is compressed
//      */
//     public void setCompressed();
// 
//     /**
//      * Specify that the storage entry is decompressed
//      */
//     public void setDecompressed();
// 
//     /**
//      * @return The content in string format
//      */
//     public String getContentString();
// 
//     @Override
//     public SocialKademliaStorageEntryMetadata getContentMetadata();
// }
// 
// Path: src/socialkademlia/util/StringCompressor.java
// public class StringCompressor
// {
// 
//     public static String compress(final byte[] input) throws IOException
//     {
//         try (ByteArrayOutputStream bout = new ByteArrayOutputStream();
//                 GZIPOutputStream gzipper = new GZIPOutputStream(bout))
//         {
//             gzipper.write(input, 0, input.length);
//             gzipper.close();
//             return Base64.getEncoder().encodeToString(bout.toByteArray());
//         }
//     }
// 
//     public static String decompress(final String input) throws IOException
//     {
//         byte[] inputBytes = Base64.getDecoder().decode(input);
// 
//         try (GZIPInputStream gzipper = new GZIPInputStream(new ByteArrayInputStream(inputBytes));
//                 BufferedReader bf = new BufferedReader(new InputStreamReader(gzipper)))
//         {
//             StringBuilder data = new StringBuilder();
//             String line;
//             while ((line = bf.readLine()) != null)
//             {
//                 data.append(line);
//             }
//             return data.toString();
//         }
//     }
// }


// Path: src/socialkademlia/dht/util/StorageEntryCompressor.java
import java.io.IOException;
import socialkademlia.dht.JSocialKademliaStorageEntry;
import socialkademlia.dht.SocialKademliaStorageEntry;
import socialkademlia.util.StringCompressor;

package socialkademlia.dht.util;


/**
 * Class that handles compression of storage entries.
 *
 * In the storage entry, it doesn't make sense to constantly compress all of the data and decompress it,
 * so we only compress the content part.
 *
 * @author Joshua Kissoon
 * @since 20140511
 */
public class StorageEntryCompressor
{

    /**
     * Compress a given storage entry.
     *
     * We only compress the content part of the storage entry.
     *
     * @param entry The entry whose content is to be compressed
     *
     * @return The entry with compressed content
     *
     * @throws java.io.IOException
     */
    public static JSocialKademliaStorageEntry compress(final JSocialKademliaStorageEntry entry) throws IOException
    {
        if (entry.isCompressed())
        {
            return entry;
        }

        try
        {
            entry.setContent(StringCompressor.compress(entry.getContent()));