Merge "524 bug - %2F slashes translation behind mount point (unit test)"
[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.DataNormalizer;
14 import org.opendaylight.yangtools.yang.binding.Augmentation;
15 import org.opendaylight.yangtools.yang.binding.DataObject;
16 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
17 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
18 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
19 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
20 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
21 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
23 import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
24 import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 import com.google.common.collect.ImmutableList;
31
32 public class BindingToNormalizedNodeCodec implements SchemaContextListener {
33
34     private static final Logger LOG = LoggerFactory.getLogger(BindingToNormalizedNodeCodec.class);
35
36     private final BindingIndependentMappingService bindingToLegacy;
37     private DataNormalizer legacyToNormalized;
38
39     public BindingToNormalizedNodeCodec(final BindingIndependentMappingService mappingService) {
40         super();
41         this.bindingToLegacy = mappingService;
42     }
43
44     public org.opendaylight.yangtools.yang.data.api.InstanceIdentifier toNormalized(
45             final InstanceIdentifier<? extends DataObject> binding) {
46         return legacyToNormalized.toNormalized(bindingToLegacy.toDataDom(binding));
47     }
48
49     public Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, NormalizedNode<?, ?>> toNormalizedNode(
50             final InstanceIdentifier<? extends DataObject> bindingPath, final DataObject bindingObject) {
51         return toNormalizedNode(toEntry(bindingPath, bindingObject));
52
53     }
54
55     public Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, NormalizedNode<?, ?>> toNormalizedNode(
56             final Entry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject> binding) {
57         Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, NormalizedNode<?, ?>> normalizedEntry = legacyToNormalized.toNormalized(bindingToLegacy.toDataDom(binding));
58         if(Augmentation.class.isAssignableFrom(binding.getKey().getTargetType())) {
59
60             for(DataContainerChild<? extends PathArgument, ?> child : ((DataContainerNode<?>) normalizedEntry.getValue()).getValue()) {
61                if(child instanceof AugmentationNode) {
62                    ImmutableList<PathArgument> childArgs = ImmutableList.<PathArgument>builder()
63                            .addAll(normalizedEntry.getKey().getPath())
64                            .add(child.getIdentifier())
65                            .build();
66                    org.opendaylight.yangtools.yang.data.api.InstanceIdentifier childPath = new org.opendaylight.yangtools.yang.data.api.InstanceIdentifier(childArgs);
67                    return new SimpleEntry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, NormalizedNode<?, ?>>(childPath,child);
68                }
69             }
70
71         }
72         return normalizedEntry;
73
74
75     }
76
77     public InstanceIdentifier<? extends DataObject> toBinding(
78             final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized)
79             throws DeserializationException {
80
81         org.opendaylight.yangtools.yang.data.api.InstanceIdentifier legacyPath = legacyToNormalized
82                 .toLegacy(normalized);
83         return bindingToLegacy.fromDataDom(legacyPath);
84     }
85
86     private static final Entry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject> toEntry(
87             final org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject> key,
88             final DataObject value) {
89         return new SimpleEntry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject>(
90                 key, value);
91     }
92
93     public DataObject toBinding(final InstanceIdentifier<?> path, final NormalizedNode<?, ?> normalizedNode)
94             throws DeserializationException {
95         return bindingToLegacy.dataObjectFromDataDom(path, (CompositeNode) DataNormalizer.toLegacy(normalizedNode));
96     }
97
98     public DataNormalizer getDataNormalizer() {
99         return legacyToNormalized;
100     }
101
102     public Entry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject> toBinding(
103             final Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, ? extends NormalizedNode<?, ?>> normalized)
104             throws DeserializationException {
105         InstanceIdentifier<? extends DataObject> bindingPath = toBinding(normalized.getKey());
106         DataObject bindingData = toBinding(bindingPath, normalized.getValue());
107         return toEntry(bindingPath, bindingData);
108     }
109
110     @Override
111     public void onGlobalContextUpdated(final SchemaContext arg0) {
112         legacyToNormalized = new DataNormalizer(arg0);
113     }
114
115 }