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