2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.md.sal.binding.impl;
10 import java.util.AbstractMap.SimpleEntry;
11 import java.util.Map.Entry;
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;
30 import com.google.common.collect.ImmutableList;
32 public class BindingToNormalizedNodeCodec implements SchemaContextListener {
34 private static final Logger LOG = LoggerFactory.getLogger(BindingToNormalizedNodeCodec.class);
36 private final BindingIndependentMappingService bindingToLegacy;
37 private DataNormalizer legacyToNormalized;
39 public BindingToNormalizedNodeCodec(final BindingIndependentMappingService mappingService) {
41 this.bindingToLegacy = mappingService;
44 public org.opendaylight.yangtools.yang.data.api.InstanceIdentifier toNormalized(
45 final InstanceIdentifier<? extends DataObject> binding) {
46 return legacyToNormalized.toNormalized(bindingToLegacy.toDataDom(binding));
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));
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())) {
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())
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);
72 return normalizedEntry;
77 public InstanceIdentifier<? extends DataObject> toBinding(
78 final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized)
79 throws DeserializationException {
81 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier legacyPath = legacyToNormalized
82 .toLegacy(normalized);
83 return bindingToLegacy.fromDataDom(legacyPath);
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>(
93 public DataObject toBinding(final InstanceIdentifier<?> path, final NormalizedNode<?, ?> normalizedNode)
94 throws DeserializationException {
95 return bindingToLegacy.dataObjectFromDataDom(path, (CompositeNode) DataNormalizer.toLegacy(normalizedNode));
98 public DataNormalizer getDataNormalizer() {
99 return legacyToNormalized;
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);
111 public void onGlobalContextUpdated(final SchemaContext arg0) {
112 legacyToNormalized = new DataNormalizer(arg0);