package peergos.shared.user.fs; import peergos.shared.cbor.*; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public interface Fragmenter extends Cborable { /** The amount of extra space required by this fragmenter compared to the original file * * @return */ double storageIncreaseFactor(); byte[][] split(byte[] input); byte[] recombine(byte[][] encoded, int inputLength); static Fragmenter fromCbor(CborObject cbor) { if (! (cbor instanceof CborObject.CborMap)) throw new IllegalStateException("Incorrect cbor for Fragmenter: " + cbor); SortedMap<CborObject, CborObject> values = ((CborObject.CborMap) cbor).values; long t = ((CborObject.CborLong) values.get(new CborObject.CborString("t"))).value; Type type = Type.ofVal((int) t); if (type == Type.SIMPLE) return new SplitFragmenter(); int originalFragments = (int)((CborObject.CborLong) values.get(new CborObject.CborString("o"))).value; int allowedFailures = (int)((CborObject.CborLong) values.get(new CborObject.CborString("a"))).value; return new ErasureFragmenter(originalFragments, allowedFailures); } enum Type { SIMPLE(0), ERASURE_CODING(1); public final int val; Type(int val) { this.val = val; } private static Map<Integer, Type> MAP = Stream.of(values()) .collect(Collectors.toMap( e -> e.val, e -> e)); public static Type ofVal(int val) { Type type = MAP.get(val); if (type == null) throw new IllegalStateException("No Fragmenter type for value "+ val); return type; } } static Fragmenter getInstance() { return new SplitFragmenter(); } }