Add UnsignedLongBitmap
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / persisted / FrontendHistoryMetadata.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.datastore.persisted;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.base.MoreObjects;
13 import java.io.DataInput;
14 import java.io.DataOutput;
15 import java.io.IOException;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.opendaylight.controller.cluster.datastore.utils.ImmutableUnsignedLongSet;
18 import org.opendaylight.controller.cluster.datastore.utils.UnsignedLongBitmap;
19 import org.opendaylight.yangtools.concepts.WritableObject;
20 import org.opendaylight.yangtools.concepts.WritableObjects;
21
22 public final class FrontendHistoryMetadata implements WritableObject {
23     private final @NonNull ImmutableUnsignedLongSet purgedTransactions;
24     private final @NonNull UnsignedLongBitmap closedTransactions;
25     private final long historyId;
26     private final long cookie;
27     private final boolean closed;
28
29     public FrontendHistoryMetadata(final long historyId, final long cookie, final boolean closed,
30             final UnsignedLongBitmap closedTransactions, final ImmutableUnsignedLongSet purgedTransactions) {
31         this.historyId = historyId;
32         this.cookie = cookie;
33         this.closed = closed;
34         this.closedTransactions = requireNonNull(closedTransactions);
35         this.purgedTransactions = requireNonNull(purgedTransactions);
36     }
37
38     public long getHistoryId() {
39         return historyId;
40     }
41
42     public long getCookie() {
43         return cookie;
44     }
45
46     public boolean isClosed() {
47         return closed;
48     }
49
50     public UnsignedLongBitmap getClosedTransactions() {
51         return closedTransactions;
52     }
53
54     public ImmutableUnsignedLongSet getPurgedTransactions() {
55         return purgedTransactions;
56     }
57
58     @Override
59     public void writeTo(final DataOutput out) throws IOException {
60         WritableObjects.writeLongs(out, historyId, cookie);
61         out.writeBoolean(closed);
62
63         final int closedSize = closedTransactions.size();
64         final int purgedSize = purgedTransactions.size();
65         WritableObjects.writeLongs(out, closedSize, purgedSize);
66         closedTransactions.writeEntriesTo(out, closedSize);
67         purgedTransactions.writeRangesTo(out, purgedSize);
68     }
69
70     public static FrontendHistoryMetadata readFrom(final DataInput in) throws IOException {
71         final byte firstHdr = WritableObjects.readLongHeader(in);
72         final long historyId = WritableObjects.readFirstLong(in, firstHdr);
73         final long cookie = WritableObjects.readSecondLong(in, firstHdr);
74         final boolean closed = in.readBoolean();
75
76         final byte secondHdr = WritableObjects.readLongHeader(in);
77         final int csize = verifySize(WritableObjects.readFirstLong(in, secondHdr));
78         final int psize = verifySize(WritableObjects.readSecondLong(in, secondHdr));
79
80         return new FrontendHistoryMetadata(historyId, cookie, closed,
81             UnsignedLongBitmap.readFrom(in, csize),
82             ImmutableUnsignedLongSet.readFrom(in, psize));
83     }
84
85     @Override
86     public String toString() {
87         return MoreObjects.toStringHelper(FrontendHistoryMetadata.class)
88             .add("historyId", historyId)
89             .add("cookie", cookie)
90             .add("closed", closed)
91             .add("closedTransactions", closedTransactions)
92             .add("purgedTransactions", purgedTransactions)
93             .toString();
94     }
95
96     private static int verifySize(final long size) throws IOException {
97         if (size < 0 || size > Integer.MAX_VALUE) {
98             throw new IOException("Invalid size " + size);
99         }
100         return (int) size;
101     }
102 }