Improve segmented journal actor metrics
[controller.git] / opendaylight / md-sal / cds-access-api / src / main / java / org / opendaylight / controller / cluster / access / concepts / Envelope.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.access.concepts;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.base.MoreObjects;
13 import java.io.Externalizable;
14 import java.io.IOException;
15 import java.io.ObjectInput;
16 import java.io.ObjectOutput;
17 import java.io.Serializable;
18 import org.eclipse.jdt.annotation.NonNull;
19 import org.opendaylight.yangtools.concepts.Immutable;
20 import org.opendaylight.yangtools.concepts.WritableObjects;
21
22 public abstract class Envelope<T extends Message<?, ?>> implements Immutable, Serializable {
23     interface SerialForm<T extends Message<?, ?>, E extends Envelope<T>> extends Externalizable {
24
25         @NonNull E envelope();
26
27         void setEnvelope(@NonNull E envelope);
28
29         @java.io.Serial
30         Object readResolve();
31
32         @Override
33         default void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
34             final byte header = WritableObjects.readLongHeader(in);
35             final var sessionId = WritableObjects.readFirstLong(in, header);
36             final var txSequence = WritableObjects.readSecondLong(in, header);
37             @SuppressWarnings("unchecked")
38             final var message = (T) in.readObject();
39             setEnvelope(readExternal(in, sessionId, txSequence, message));
40         }
41
42         E readExternal(ObjectInput in, long sessionId, long txSequence, T message) throws IOException;
43
44         @Override
45         default void writeExternal(final ObjectOutput out) throws IOException {
46             writeExternal(out, envelope());
47         }
48
49         default void writeExternal(final ObjectOutput out, final @NonNull E envelope) throws IOException {
50             WritableObjects.writeLongs(out, envelope.getSessionId(), envelope.getTxSequence());
51             out.writeObject(envelope.getMessage());
52         }
53     }
54
55     @java.io.Serial
56     private static final long serialVersionUID = 1L;
57
58     private final @NonNull T message;
59     private final long txSequence;
60     private final long sessionId;
61
62     Envelope(final T message, final long sessionId, final long txSequence) {
63         this.message = requireNonNull(message);
64         this.sessionId = sessionId;
65         this.txSequence = txSequence;
66     }
67
68     /**
69      * Get the enclosed message.
70      *
71      * @return enclose message
72      */
73     public @NonNull T getMessage() {
74         return message;
75     }
76
77     /**
78      * Get the message transmission sequence of this envelope.
79      *
80      * @return Message sequence
81      */
82     public long getTxSequence() {
83         return txSequence;
84     }
85
86     /**
87      * Get the session identifier.
88      *
89      * @return Session identifier
90      */
91     public long getSessionId() {
92         return sessionId;
93     }
94
95     @Override
96     public String toString() {
97         return MoreObjects.toStringHelper(Envelope.class).add("sessionId", Long.toHexString(sessionId))
98                 .add("txSequence", Long.toHexString(txSequence)).add("message", message).toString();
99     }
100
101     @java.io.Serial
102     final Object writeReplace() {
103         return createProxy();
104     }
105
106     abstract @NonNull SerialForm<T, ?> createProxy();
107 }