Merge "Resolve Bug:745 - remove windows line endings from config and netconf."
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / md / sal / binding / impl / BindingToNormalizedNodeCodec.java
1 /*
2  * Copyright (c) 2014 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.controller.md.sal.binding.impl;
9
10 import java.util.AbstractMap.SimpleEntry;
11 import java.util.Map.Entry;
12
13 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationException;
14 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer;
15 import org.opendaylight.yangtools.yang.binding.Augmentation;
16 import org.opendaylight.yangtools.yang.binding.DataObject;
17 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
18 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
19 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
20 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
22 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
24 import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
25 import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
26 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
27 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 import com.google.common.collect.ImmutableList;
32
33 public class BindingToNormalizedNodeCodec implements SchemaContextListener {
34
35     private static final Logger LOG = LoggerFactory.getLogger(BindingToNormalizedNodeCodec.class);
36
37     private final BindingIndependentMappingService bindingToLegacy;
38     private DataNormalizer legacyToNormalized;
39
40     public BindingToNormalizedNodeCodec(final BindingIndependentMappingService mappingService) {
41         super();
42         this.bindingToLegacy = mappingService;
43     }
44
45     public org.opendaylight.yangtools.yang.data.api.InstanceIdentifier toNormalized(
46             final InstanceIdentifier<? extends DataObject> binding) {
47         final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier legacyPath = bindingToLegacy.toDataDom(binding);
48         final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized = legacyToNormalized.toNormalized(legacyPath);
49         LOG.trace("InstanceIdentifier Path {} Serialization: Legacy representation {}, Normalized representation: {}",binding,legacyPath,normalized);
50         return normalized;
51     }
52
53     public Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, NormalizedNode<?, ?>> toNormalizedNode(
54             final InstanceIdentifier<? extends DataObject> bindingPath, final DataObject bindingObject) {
55         return toNormalizedNode(toEntry(bindingPath, bindingObject));
56
57     }
58
59     public Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, NormalizedNode<?, ?>> toNormalizedNode(
60             final Entry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject> binding) {
61         Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> legacyEntry = bindingToLegacy.toDataDom(binding);
62         Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, NormalizedNode<?, ?>> normalizedEntry = legacyToNormalized.toNormalized(legacyEntry);
63         LOG.trace("Serialization of {}, Legacy Representation: {}, Normalized Representation: {}",binding,legacyEntry,normalizedEntry);
64         if(Augmentation.class.isAssignableFrom(binding.getKey().getTargetType())) {
65
66             for(DataContainerChild<? extends PathArgument, ?> child : ((DataContainerNode<?>) normalizedEntry.getValue()).getValue()) {
67                if(child instanceof AugmentationNode) {
68                    ImmutableList<PathArgument> childArgs = ImmutableList.<PathArgument>builder()
69                            .addAll(normalizedEntry.getKey().getPath())
70                            .add(child.getIdentifier())
71                            .build();
72                    org.opendaylight.yangtools.yang.data.api.InstanceIdentifier childPath = new org.opendaylight.yangtools.yang.data.api.InstanceIdentifier(childArgs);
73                    return new SimpleEntry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, NormalizedNode<?, ?>>(childPath,child);
74                }
75             }
76
77         }
78         return normalizedEntry;
79
80
81     }
82
83     public InstanceIdentifier<? extends DataObject> toBinding(
84             final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized)
85             throws DeserializationException {
86
87         org.opendaylight.yangtools.yang.data.api.InstanceIdentifier legacyPath;
88         try {
89             legacyPath = legacyToNormalized.toLegacy(normalized);
90         } catch (DataNormalizationException e) {
91             throw new IllegalStateException("Could not denormalize path.",e);
92         }
93         LOG.trace("InstanceIdentifier Path Deserialization: Legacy representation {}, Normalized representation: {}",legacyPath,normalized);
94         return bindingToLegacy.fromDataDom(legacyPath);
95     }
96
97     private static final Entry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject> toEntry(
98             final org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject> key,
99             final DataObject value) {
100         return new SimpleEntry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject>(
101                 key, value);
102     }
103
104     public DataObject toBinding(final InstanceIdentifier<?> path, final NormalizedNode<?, ?> normalizedNode)
105             throws DeserializationException {
106         return bindingToLegacy.dataObjectFromDataDom(path, (CompositeNode) DataNormalizer.toLegacy(normalizedNode));
107     }
108
109     public DataNormalizer getDataNormalizer() {
110         return legacyToNormalized;
111     }
112
113     public Entry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject> toBinding(
114             final Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, ? extends NormalizedNode<?, ?>> normalized)
115             throws DeserializationException {
116         InstanceIdentifier<? extends DataObject> bindingPath = toBinding(normalized.getKey());
117         DataObject bindingData = toBinding(bindingPath, normalized.getValue());
118         return toEntry(bindingPath, bindingData);
119     }
120
121     @Override
122     public void onGlobalContextUpdated(final SchemaContext arg0) {
123         legacyToNormalized = new DataNormalizer(arg0);
124     }
125
126 }