import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Map.Entry;
import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload;
+import org.opendaylight.controller.cluster.raft.protobuff.client.messages.IdentifiablePayload;
import org.opendaylight.yangtools.concepts.Variant;
import org.opendaylight.yangtools.yang.data.api.schema.stream.ReusableStreamReceiver;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
* @author Robert Varga
*/
@Beta
-public abstract class CommitTransactionPayload extends Payload implements Serializable {
+public abstract class CommitTransactionPayload extends IdentifiablePayload<TransactionIdentifier>
+ implements Serializable {
private static final Logger LOG = LoggerFactory.getLogger(CommitTransactionPayload.class);
private static final long serialVersionUID = 1L;
+ private volatile Entry<TransactionIdentifier, DataTreeCandidate> candidate = null;
+
CommitTransactionPayload() {
}
}
public Entry<TransactionIdentifier, DataTreeCandidate> getCandidate() throws IOException {
- return getCandidate(ReusableImmutableNormalizedNodeStreamWriter.create());
+ Entry<TransactionIdentifier, DataTreeCandidate> localCandidate = candidate;
+ if (localCandidate == null) {
+ synchronized (this) {
+ localCandidate = candidate;
+ if (localCandidate == null) {
+ candidate = localCandidate = getCandidate(ReusableImmutableNormalizedNodeStreamWriter.create());
+ }
+ }
+ }
+ return localCandidate;
}
public final Entry<TransactionIdentifier, DataTreeCandidate> getCandidate(
DataTreeCandidateInputOutput.readDataTreeCandidate(in, receiver));
}
+ public TransactionIdentifier getIdentifier() {
+ try {
+ return getCandidate().getKey();
+ } catch (IOException e) {
+ throw new IllegalStateException("Candidate deserialization failed.", e);
+ }
+ }
+
abstract void writeBytes(ObjectOutput out) throws IOException;
abstract DataInput newDataInput();