Removed sonar warnings from binding-dom-adapter.
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / BindingDOMDataTreeWriteCursorAdapter.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.binding.dom.adapter;
10
11 import java.util.AbstractMap.SimpleEntry;
12 import java.util.ArrayDeque;
13 import java.util.Deque;
14 import java.util.Map.Entry;
15 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
16 import org.opendaylight.mdsal.binding.api.DataTreeWriteCursor;
17 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteCursor;
18 import org.opendaylight.yangtools.yang.binding.DataObject;
19 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
22 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
23
24 public class BindingDOMDataTreeWriteCursorAdapter<T extends DOMDataTreeWriteCursor> implements DataTreeWriteCursor {
25
26     private T delegate;
27     private BindingToNormalizedNodeCodec codec;
28     private final Deque<PathArgument> stack = new ArrayDeque<>();
29
30     public BindingDOMDataTreeWriteCursorAdapter(final DataTreeIdentifier<?> path, final T delegate,
31             final BindingToNormalizedNodeCodec codec) {
32
33         this.delegate = delegate;
34         this.codec = codec;
35         path.getRootIdentifier().getPathArguments().forEach(stack::push);
36     }
37
38     private YangInstanceIdentifier.PathArgument convertToNormalized(final PathArgument child) {
39         stack.push(child);
40         final InstanceIdentifier<?> iid = InstanceIdentifier.create(stack);
41         final YangInstanceIdentifier ret = codec.toNormalized(iid);
42         stack.pop();
43         return ret.getLastPathArgument();
44     }
45
46     private <P extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> convertToNormalized(
47             final PathArgument child, final P data) {
48         stack.push(child);
49         final InstanceIdentifier<?> iid = InstanceIdentifier.create(stack);
50         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry
51                 = codec.toNormalizedNode(new SimpleEntry<>(iid, data));
52         stack.pop();
53         return entry;
54     }
55
56     @Override
57     public void delete(final PathArgument child) {
58         delegate.delete(convertToNormalized(child));
59     }
60
61     @Override
62     public <P extends DataObject> void merge(final PathArgument child, final P data) {
63         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = convertToNormalized(child, data);
64         delegate.merge(entry.getKey().getLastPathArgument(), entry.getValue());
65     }
66
67     @Override
68     public <P extends DataObject> void write(final PathArgument child, P data) {
69         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = convertToNormalized(child, data);
70         delegate.write(entry.getKey().getLastPathArgument(), entry.getValue());
71     }
72
73     @Override
74     public void enter(final PathArgument child) {
75         stack.push(child);
76     }
77
78     @Override
79     public void enter(final PathArgument... path) {
80         for (final PathArgument pathArgument : path) {
81             enter(pathArgument);
82         }
83     }
84
85     @Override
86     public void enter(final Iterable<PathArgument> path) {
87         path.forEach(this::enter);
88     }
89
90     @Override
91     public void exit() {
92         stack.pop();
93     }
94
95     @Override
96     public void exit(int depth) {
97         for (int i = 0; i < depth; i++) {
98             exit();
99         }
100     }
101
102     @Override
103     public void close() {
104         delegate.close();
105     }
106 }