Add case for READY in RemoteProxyTransaction
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / sharding / DistributedShardModification.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
9 package org.opendaylight.controller.cluster.sharding;
10
11 import com.google.common.base.Preconditions;
12 import java.util.Map;
13 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
14 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteCursor;
15 import org.opendaylight.mdsal.dom.spi.shard.ForeignShardModificationContext;
16 import org.opendaylight.mdsal.dom.spi.shard.WritableNodeOperation;
17 import org.opendaylight.mdsal.dom.spi.shard.WriteCursorStrategy;
18 import org.opendaylight.mdsal.dom.spi.shard.WriteableModificationNode;
19 import org.opendaylight.mdsal.dom.spi.shard.WriteableNodeWithSubshard;
20 import org.opendaylight.mdsal.dom.spi.store.DOMStoreThreePhaseCommitCohort;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
22
23 /**
24  * Shard modification that consists of the whole shard context, provides cursors which correctly delegate to subshards
25  * if any are present.
26  */
27 public class DistributedShardModification extends WriteableNodeWithSubshard {
28
29     private final DistributedShardModificationContext context;
30     private final Map<DOMDataTreeIdentifier, ForeignShardModificationContext> childShards;
31
32     public DistributedShardModification(final DistributedShardModificationContext context,
33                                         final Map<PathArgument, WriteableModificationNode> subshards,
34                                         final Map<DOMDataTreeIdentifier, ForeignShardModificationContext> childShards) {
35         super(subshards);
36         this.context = Preconditions.checkNotNull(context);
37         this.childShards = Preconditions.checkNotNull(childShards);
38     }
39
40     @Override
41     public PathArgument getIdentifier() {
42         return context.getIdentifier().getRootIdentifier().getLastPathArgument();
43     }
44
45     @Override
46     public WriteCursorStrategy createOperation(final DOMDataTreeWriteCursor parentCursor) {
47         return new WritableNodeOperation(this, context.cursor()) {
48             @Override
49             public void exit() {
50                 throw new IllegalStateException("Can not exit data tree root");
51             }
52         };
53     }
54
55     void cursorClosed() {
56         context.closeCursor();
57     }
58
59     DOMStoreThreePhaseCommitCohort seal() {
60         childShards.values().stream().filter(ForeignShardModificationContext::isModified)
61                 .forEach(ForeignShardModificationContext::ready);
62
63         return context.ready();
64     }
65
66     DOMDataTreeIdentifier getPrefix() {
67         return context.getIdentifier();
68     }
69
70     Map<DOMDataTreeIdentifier, ForeignShardModificationContext> getChildShards() {
71         return childShards;
72     }
73 }