- public Optional<InstanceIdentifier<? extends DataObject>> toBinding(
- final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized)
- throws DeserializationException {
-
- PathArgument lastArgument = Iterables.getLast(normalized.getPath());
- // Used instance-identifier codec do not support serialization of last
- // path
- // argument if it is AugmentationIdentifier (behaviour expected by old
- // datastore)
- // in this case, we explicitly check if last argument is augmentation
- // to process it separately
- if (lastArgument instanceof AugmentationIdentifier) {
- return toBindingAugmented(normalized);
- }
- return toBindingImpl(normalized);
- }
-
- private Optional<InstanceIdentifier<? extends DataObject>> toBindingAugmented(
- final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized)
- throws DeserializationException {
- Optional<InstanceIdentifier<? extends DataObject>> potential = toBindingImpl(normalized);
- // Shorthand check, if codec already supports deserialization
- // of AugmentationIdentifier we will return
- if (potential.isPresent() && isAugmentationIdentifier(potential.get())) {
- return potential;
- }
-
- int normalizedCount = getAugmentationCount(normalized);
- AugmentationIdentifier lastArgument = (AugmentationIdentifier) Iterables.getLast(normalized.getPath());
-
- // Here we employ small trick - Binding-aware Codec injects an pointer
- // to augmentation class
- // if child is referenced - so we will reference child and then shorten
- // path.
- LOG.trace("Looking for candidates to match {}", normalized);
- for (QName child : lastArgument.getPossibleChildNames()) {
- org.opendaylight.yangtools.yang.data.api.InstanceIdentifier childPath = new org.opendaylight.yangtools.yang.data.api.InstanceIdentifier(
- ImmutableList.<PathArgument> builder().addAll(normalized.getPath()).add(new NodeIdentifier(child))
- .build());
- try {
- if (isNotRepresentable(childPath)) {
- LOG.trace("Path {} is not BI-representable, skipping it", childPath);
- continue;
- }
- } catch (DataNormalizationException e) {
- LOG.warn("Failed to denormalize path {}, skipping it", childPath, e);
- continue;
- }
-
- Optional<InstanceIdentifier<? extends DataObject>> baId = toBindingImpl(childPath);
- if (!baId.isPresent()) {
- LOG.debug("No binding-aware identifier found for path {}, skipping it", childPath);
- continue;
- }
-
- InstanceIdentifier<? extends DataObject> potentialPath = shortenToLastAugment(baId.get());
- int potentialAugmentCount = getAugmentationCount(potentialPath);
- if (potentialAugmentCount == normalizedCount) {
- LOG.trace("Found matching path {}", potentialPath);
- return Optional.<InstanceIdentifier<? extends DataObject>> of(potentialPath);
- }
-
- LOG.trace("Skipping mis-matched potential path {}", potentialPath);
- }
-
- LOG.trace("Failed to find augmentation matching {}", normalized);
- return Optional.absent();
- }
-
- private Optional<InstanceIdentifier<? extends DataObject>> toBindingImpl(
- final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized)
- throws DeserializationException {
- org.opendaylight.yangtools.yang.data.api.InstanceIdentifier legacyPath;
-
- try {
- if (isNotRepresentable(normalized)) {
- return Optional.absent();
- }
- legacyPath = legacyToNormalized.toLegacy(normalized);
- } catch (DataNormalizationException e) {
- throw new IllegalStateException("Could not denormalize path.", e);
- }
- LOG.trace("InstanceIdentifier Path Deserialization: Legacy representation {}, Normalized representation: {}",
- legacyPath, normalized);
- return Optional.<InstanceIdentifier<? extends DataObject>> of(bindingToLegacy.fromDataDom(legacyPath));
- }
-
- private boolean isNotRepresentable(final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized)
- throws DataNormalizationException {
- DataNormalizationOperation<?> op = findNormalizationOperation(normalized);
- if( op.isMixin() && op.getIdentifier() instanceof NodeIdentifier) {
- return true;
- }
- if(op.isLeaf()) {
- return true;
- }
- return false;
- }
-
- private DataNormalizationOperation<?> findNormalizationOperation(
- final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized)
- throws DataNormalizationException {
- DataNormalizationOperation<?> current = legacyToNormalized.getRootOperation();
- for (PathArgument arg : normalized.getPath()) {
- current = current.getChild(arg);
- }
- return current;
- }
-
- private static final Entry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject> toEntry(
- final org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject> key,
- final DataObject value) {
- return new SimpleEntry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject>(
- key, value);
- }
-
- public DataObject toBinding(final InstanceIdentifier<?> path, final NormalizedNode<?, ?> normalizedNode)
- throws DeserializationException {
- CompositeNode legacy = null;
- if (isAugmentationIdentifier(path) && normalizedNode instanceof AugmentationNode) {
- QName augIdentifier = BindingReflections.findQName(path.getTargetType());
- ContainerNode virtualNode = Builders.containerBuilder() //
- .withNodeIdentifier(new NodeIdentifier(augIdentifier)) //
- .withChild((DataContainerChild<?, ?>) normalizedNode) //
- .build();
- legacy = (CompositeNode) DataNormalizer.toLegacy(virtualNode);
- } else {
- legacy = (CompositeNode) DataNormalizer.toLegacy(normalizedNode);
- }
-
- return bindingToLegacy.dataObjectFromDataDom(path, legacy);
- }
-
- public DataNormalizer getDataNormalizer() {
- return legacyToNormalized;
- }
-
- public Optional<Entry<org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>, DataObject>> toBinding(
- final Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, ? extends NormalizedNode<?, ?>> normalized)
- throws DeserializationException {
- Optional<InstanceIdentifier<? extends DataObject>> potentialPath = toBinding(normalized.getKey());
- if (potentialPath.isPresent()) {
- InstanceIdentifier<? extends DataObject> bindingPath = potentialPath.get();
- DataObject bindingData = toBinding(bindingPath, normalized.getValue());
- if (bindingData == null) {
- LOG.warn("Failed to deserialize {} to Binding format. Binding path is: {}", normalized, bindingPath);
- }
- return Optional.of(toEntry(bindingPath, bindingData));
- } else {
- return Optional.absent();
- }
- }
-