/* * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.md.sal.binding.impl; import java.util.AbstractMap.SimpleEntry; import java.util.Map.Entry; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService; import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableList; public class BindingToNormalizedNodeCodec implements SchemaContextListener { private static final Logger LOG = LoggerFactory.getLogger(BindingToNormalizedNodeCodec.class); private final BindingIndependentMappingService bindingToLegacy; private DataNormalizer legacyToNormalized; public BindingToNormalizedNodeCodec(final BindingIndependentMappingService mappingService) { super(); this.bindingToLegacy = mappingService; } public org.opendaylight.yangtools.yang.data.api.InstanceIdentifier toNormalized( final InstanceIdentifier binding) { return legacyToNormalized.toNormalized(bindingToLegacy.toDataDom(binding)); } public Entry> toNormalizedNode( final InstanceIdentifier bindingPath, final DataObject bindingObject) { return toNormalizedNode(toEntry(bindingPath, bindingObject)); } public Entry> toNormalizedNode( final Entry, DataObject> binding) { Entry> normalizedEntry = legacyToNormalized.toNormalized(bindingToLegacy.toDataDom(binding)); if(Augmentation.class.isAssignableFrom(binding.getKey().getTargetType())) { for(DataContainerChild child : ((DataContainerNode) normalizedEntry.getValue()).getValue()) { if(child instanceof AugmentationNode) { ImmutableList childArgs = ImmutableList.builder() .addAll(normalizedEntry.getKey().getPath()) .add(child.getIdentifier()) .build(); org.opendaylight.yangtools.yang.data.api.InstanceIdentifier childPath = new org.opendaylight.yangtools.yang.data.api.InstanceIdentifier(childArgs); return new SimpleEntry>(childPath,child); } } } return normalizedEntry; } public InstanceIdentifier toBinding( final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized) throws DeserializationException { org.opendaylight.yangtools.yang.data.api.InstanceIdentifier legacyPath = legacyToNormalized .toLegacy(normalized); return bindingToLegacy.fromDataDom(legacyPath); } private static final Entry, DataObject> toEntry( final org.opendaylight.yangtools.yang.binding.InstanceIdentifier key, final DataObject value) { return new SimpleEntry, DataObject>( key, value); } public DataObject toBinding(final InstanceIdentifier path, final NormalizedNode normalizedNode) throws DeserializationException { return bindingToLegacy.dataObjectFromDataDom(path, (CompositeNode) DataNormalizer.toLegacy(normalizedNode)); } public DataNormalizer getDataNormalizer() { return legacyToNormalized; } public Entry, DataObject> toBinding( final Entry> normalized) throws DeserializationException { InstanceIdentifier bindingPath = toBinding(normalized.getKey()); DataObject bindingData = toBinding(bindingPath, normalized.getValue()); return toEntry(bindingPath, bindingData); } @Override public void onGlobalContextUpdated(final SchemaContext arg0) { legacyToNormalized = new DataNormalizer(arg0); } }