X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fpersisted%2FChunkedByteArray.java;fp=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fpersisted%2FChunkedByteArray.java;h=73a7df95421b7f4454f16636c57a6fe3f328e23e;hp=0000000000000000000000000000000000000000;hb=afe114674227071a2598dd3a3f6589a99573e075;hpb=9112031a13f4bc73ea5504da290ddeca0f7d2c17 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ChunkedByteArray.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ChunkedByteArray.java new file mode 100644 index 0000000000..73a7df9542 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ChunkedByteArray.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.cluster.datastore.persisted; + +import static java.util.Objects.requireNonNull; + +import com.google.common.base.MoreObjects; +import com.google.common.collect.ImmutableList; +import java.io.DataOutput; +import java.io.IOException; +import java.io.ObjectInput; +import java.util.ArrayList; +import java.util.List; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.opendaylight.yangtools.concepts.Immutable; + +@NonNullByDefault +final class ChunkedByteArray implements Immutable { + private final ImmutableList chunks; + private final int size; + + ChunkedByteArray(final int size, final ImmutableList chunks) { + this.size = size; + this.chunks = requireNonNull(chunks); + } + + static ChunkedByteArray readFrom(final ObjectInput in, final int size, final int chunkSize) + throws IOException { + final List chunks = new ArrayList<>(requiredChunks(size, chunkSize)); + int remaining = size; + do { + final byte[] buffer = new byte[Math.min(remaining, chunkSize)]; + in.readFully(buffer); + chunks.add(buffer); + remaining -= buffer.length; + } while (remaining != 0); + + return new ChunkedByteArray(size, ImmutableList.copyOf(chunks)); + } + + int size() { + return size; + } + + ChunkedInputStream openStream() { + return new ChunkedInputStream(size, chunks.iterator()); + } + + void copyTo(final DataOutput output) throws IOException { + for (byte[] chunk : chunks) { + output.write(chunk, 0, chunk.length); + } + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this).add("size", size).add("chunkCount", chunks.size()).toString(); + } + + ImmutableList getChunks() { + return chunks; + } + + private static int requiredChunks(final int size, final int chunkSize) { + final int div = size / chunkSize; + return size % chunkSize == 0 ? div : div + 1; + } +}