Add batching of non-isolated transaction in ShardedDOMDataTreeProducer
[mdsal.git] / dom / mdsal-dom-inmemory-datastore / src / main / java / org / opendaylight / mdsal / dom / store / inmemory / ShardRootModificationContext.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.mdsal.dom.store.inmemory;
10
11 import com.google.common.base.Preconditions;
12 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
14 import org.opendaylight.yangtools.yang.data.api.schema.tree.CursorAwareDataTreeModification;
15 import org.opendaylight.yangtools.yang.data.api.schema.tree.CursorAwareDataTreeSnapshot;
16 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
17 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModificationCursor;
18
19 class ShardRootModificationContext {
20
21     private final DOMDataTreeIdentifier identifier;
22     private final CursorAwareDataTreeSnapshot snapshot;
23     private CursorAwareDataTreeModification modification = null;
24     private DataTreeModificationCursorAdaptor cursor = null;
25
26     ShardRootModificationContext(final DOMDataTreeIdentifier identifier,
27             final CursorAwareDataTreeSnapshot snapshot) {
28         this.identifier = Preconditions.checkNotNull(identifier);
29         this.snapshot = Preconditions.checkNotNull(snapshot);
30     }
31
32     public DOMDataTreeIdentifier getIdentifier() {
33         return identifier;
34     }
35
36     DataTreeModificationCursorAdaptor cursor() {
37         if (cursor == null) {
38             if (modification == null) {
39                 modification = (CursorAwareDataTreeModification) snapshot.newModification();
40             }
41
42             // FIXME: Should there be non-root path?
43             DataTreeModificationCursor dataTreeCursor =
44                     modification.createCursor(YangInstanceIdentifier.EMPTY);
45             cursor = DataTreeModificationCursorAdaptor.of(dataTreeCursor);
46         }
47         return cursor;
48     }
49
50     boolean isModified() {
51         return modification != null;
52     }
53
54     DataTreeModification ready() {
55         if (cursor != null) {
56             cursor.close();
57             cursor = null;
58         }
59         DataTreeModification ret = null;
60         if (modification != null) {
61             modification.ready();
62             ret = modification;
63             modification = null;
64         }
65
66         return ret;
67     }
68
69     void closeCursor() {
70         cursor.close();
71         cursor = null;
72     }
73 }