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.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;
31 import com.google.common.collect.ImmutableList;
33 public class BindingToNormalizedNodeCodec implements SchemaContextListener {
35 private static final Logger LOG = LoggerFactory.getLogger(BindingToNormalizedNodeCodec.class);
37 private final BindingIndependentMappingService bindingToLegacy;
38 private DataNormalizer legacyToNormalized;
40 public BindingToNormalizedNodeCodec(final BindingIndependentMappingService mappingService) {
42 this.bindingToLegacy = mappingService;
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);
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));
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())) {
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())
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);
78 return normalizedEntry;
83 public InstanceIdentifier<? extends DataObject> toBinding(
84 final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized)
85 throws DeserializationException {
87 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier legacyPath;
89 legacyPath = legacyToNormalized.toLegacy(normalized);
90 } catch (DataNormalizationException e) {
91 throw new IllegalStateException("Could not denormalize path.",e);
93 LOG.trace("InstanceIdentifier Path Deserialization: Legacy representation {}, Normalized representation: {}",legacyPath,normalized);
94 return bindingToLegacy.fromDataDom(legacyPath);
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>(
104 public DataObject toBinding(final InstanceIdentifier<?> path, final NormalizedNode<?, ?> normalizedNode)
105 throws DeserializationException {
106 return bindingToLegacy.dataObjectFromDataDom(path, (CompositeNode) DataNormalizer.toLegacy(normalizedNode));
109 public DataNormalizer getDataNormalizer() {
110 return legacyToNormalized;
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);
122 public void onGlobalContextUpdated(final SchemaContext arg0) {
123 legacyToNormalized = new DataNormalizer(arg0);