package net.i2p.data; /* * free (adj.): unencumbered; not under the control of others * Written by jrandom in 2003 and released into the public domain * with no warranty of any kind, either expressed or implied. * It probably won't make your computer catch on fire, or eat * your children, but it might. Use at your own risk. * */ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import net.i2p.I2PAppContext; import net.i2p.crypto.SHA256Generator; import net.i2p.util.Log; /** * Base implementation of all data structures * * @author jrandom */ public abstract class DataStructureImpl implements DataStructure, Serializable { public String toBase64() { byte data[] = toByteArray(); if (data == null) return null; return Base64.encode(data); } public void fromBase64(String data) throws DataFormatException { if (data == null) throw new DataFormatException("Null data passed in"); byte bytes[] = Base64.decode(data); if (bytes == null) throw new DataFormatException("Bad Base64 \"" + data + '"'); fromByteArray(bytes); } public Hash calculateHash() { byte data[] = toByteArray(); if (data != null) return SHA256Generator.getInstance().calculateHash(data); return null; } public byte[] toByteArray() { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(512); writeBytes(baos); return baos.toByteArray(); } catch (IOException ioe) { Log log = I2PAppContext.getGlobalContext().logManager().getLog(getClass()); log.error("Error writing out the byte array", ioe); return null; } catch (DataFormatException dfe) { Log log = I2PAppContext.getGlobalContext().logManager().getLog(getClass()); log.error("Error writing out the byte array", dfe); return null; } } public void fromByteArray(byte data[]) throws DataFormatException { if (data == null) throw new DataFormatException("Null data passed in"); try { ByteArrayInputStream bais = new ByteArrayInputStream(data); readBytes(bais); } catch (IOException ioe) { throw new DataFormatException("Error reading the byte array", ioe); } } /** * Repeated reads until the buffer is full or IOException is thrown * * @return number of bytes read (should always equal target.length) */ protected int read(InputStream in, byte target[]) throws IOException { return DataHelper.read(in, target); } }