f6577a5e5923cdba57b93210e24f3d662fb9efa0
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / BindingStructuralType.java
1 /*
2  * Copyright (c) 2015 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.base.Optional;
11 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
12 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
14 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
15 import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
16 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
17 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
18 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
20 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
25 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode;
26
27 /**
28  * Defines structural mapping of Normalized Node to Binding data
29  * addressable by Instance Identifier.
30  *
31  * <p>
32  * Not all binding data are addressable by instance identifier
33  * and there are some differences.
34  *
35  * <p>
36  * See {@link #NOT_ADDRESSABLE},{@link #INVISIBLE_CONTAINER},{@link #VISIBLE_CONTAINER}
37  * for more details.
38  */
39 enum BindingStructuralType {
40
41     /**
42      * DOM Item is not addressable in Binding Instance Identifier,
43      * data is not lost, but are available only via parent object.
44      *
45      * <p>
46      * Such types of data are leaf-lists, leafs, list without keys
47      * or anyxml.
48      *
49      */
50     NOT_ADDRESSABLE,
51     /**
52      * Data container is addressable in NormalizedNode format,
53      * but in Binding it is not represented in Instance Identifier.
54      *
55      * <p>
56      * This are choice / case nodes.
57      *
58      * <p>
59      * This data is still accessible using parent object and their
60      * children are addressable.
61      *
62      */
63     INVISIBLE_CONTAINER,
64     /**
65      * Data container is addressable in NormalizedNode format,
66      * but in Binding it is not represented in Instance Identifier.
67      *
68      * <p>
69      * This are list nodes.
70      *
71      * <p>
72      * This data is still accessible using parent object and their
73      * children are addressable.
74      *
75      */
76     INVISIBLE_LIST,
77     /**
78      * Data container is addressable in Binding Instance Identifier format
79      * and also YangInstanceIdentifier format.
80      *
81      */
82     VISIBLE_CONTAINER,
83     /**
84      * Mapping algorithm was unable to detect type or was not updated after introduction
85      * of new NormalizedNode type.
86      */
87     UNKNOWN;
88
89     static BindingStructuralType from(final DataTreeCandidateNode domChildNode) {
90         final Optional<NormalizedNode<?, ?>> dataBased = domChildNode.getDataAfter().or(domChildNode.getDataBefore());
91         if (dataBased.isPresent()) {
92             return from(dataBased.get());
93         }
94         return from(domChildNode.getIdentifier());
95     }
96
97     private static BindingStructuralType from(final PathArgument identifier) {
98         if (identifier instanceof NodeIdentifierWithPredicates || identifier instanceof AugmentationIdentifier) {
99             return VISIBLE_CONTAINER;
100         }
101         if (identifier instanceof NodeWithValue) {
102             return NOT_ADDRESSABLE;
103         }
104         return UNKNOWN;
105     }
106
107     static BindingStructuralType from(final NormalizedNode<?, ?> data) {
108         if (isNotAddressable(data)) {
109             return NOT_ADDRESSABLE;
110         }
111         if (data instanceof MapNode) {
112             return INVISIBLE_LIST;
113         }
114         if (data instanceof ChoiceNode) {
115             return INVISIBLE_CONTAINER;
116         }
117         if (isVisibleContainer(data)) {
118             return VISIBLE_CONTAINER;
119         }
120         return UNKNOWN;
121     }
122
123     private static boolean isVisibleContainer(final NormalizedNode<?, ?> data) {
124         return data instanceof MapEntryNode || data instanceof ContainerNode || data instanceof AugmentationNode;
125     }
126
127     private static boolean isNotAddressable(final NormalizedNode<?, ?> normalizedNode) {
128         return normalizedNode instanceof LeafNode
129                 || normalizedNode instanceof AnyXmlNode
130                 || normalizedNode instanceof LeafSetNode
131                 || normalizedNode instanceof LeafSetEntryNode;
132     }
133
134 }