BUG-8618: rework AbstractProxyTransaction.flushState()
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / databroker / actors / dds / LocalReadOnlyProxyTransaction.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.databroker.actors.dds;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.base.Verify;
12 import java.util.Optional;
13 import java.util.function.Consumer;
14 import javax.annotation.concurrent.NotThreadSafe;
15 import org.opendaylight.controller.cluster.access.commands.CommitLocalTransactionRequest;
16 import org.opendaylight.controller.cluster.access.commands.ModifyTransactionRequest;
17 import org.opendaylight.controller.cluster.access.commands.PersistenceProtocol;
18 import org.opendaylight.controller.cluster.access.concepts.Response;
19 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
21 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
23
24 /**
25  * A read-only specialization of {@link LocalProxyTransaction}.
26  *
27  * @author Robert Varga
28  */
29 @NotThreadSafe
30 final class LocalReadOnlyProxyTransaction extends LocalProxyTransaction {
31
32     private final DataTreeSnapshot snapshot;
33
34     LocalReadOnlyProxyTransaction(final ProxyHistory parent, final TransactionIdentifier identifier,
35         final DataTreeSnapshot snapshot) {
36         super(parent, identifier, false);
37         this.snapshot = Preconditions.checkNotNull(snapshot);
38     }
39
40     LocalReadOnlyProxyTransaction(final ProxyHistory parent, final TransactionIdentifier identifier) {
41         super(parent, identifier, true);
42         // It is an error to touch snapshot once we are DONE
43         this.snapshot = null;
44     }
45
46     @Override
47     boolean isSnapshotOnly() {
48         return true;
49     }
50
51     @Override
52     DataTreeSnapshot readOnlyView() {
53         return Preconditions.checkNotNull(snapshot, "Transaction %s is DONE", getIdentifier());
54     }
55
56     @Override
57     void doDelete(final YangInstanceIdentifier path) {
58         throw new UnsupportedOperationException("Read-only snapshot");
59     }
60
61     @Override
62     void doMerge(final YangInstanceIdentifier path, final NormalizedNode<?, ?> data) {
63         throw new UnsupportedOperationException("Read-only snapshot");
64     }
65
66     @Override
67     void doWrite(final YangInstanceIdentifier path, final NormalizedNode<?, ?> data) {
68         throw new UnsupportedOperationException("Read-only snapshot");
69     }
70
71     @Override
72     CommitLocalTransactionRequest commitRequest(final boolean coordinated) {
73         throw new UnsupportedOperationException("Read-only snapshot");
74     }
75
76     @Override
77     Optional<ModifyTransactionRequest> flushState() {
78         // No-op
79         return Optional.empty();
80     }
81
82     @Override
83     void applyForwardedModifyTransactionRequest(final ModifyTransactionRequest request,
84             final Consumer<Response<?, ?>> callback) {
85         commonModifyTransactionRequest(request);
86         abort();
87     }
88
89     @Override
90     void replayModifyTransactionRequest(final ModifyTransactionRequest request,
91             final Consumer<Response<?, ?>> callback, final long enqueuedTicks) {
92         commonModifyTransactionRequest(request);
93         enqueueAbort(callback, enqueuedTicks);
94     }
95
96     private static void commonModifyTransactionRequest(final ModifyTransactionRequest request) {
97         Verify.verify(request.getModifications().isEmpty());
98
99         final PersistenceProtocol protocol = request.getPersistenceProtocol().get();
100         Verify.verify(protocol == PersistenceProtocol.ABORT);
101     }
102 }