/* * 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.yangtools.yang.data.impl.schema.tree; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.data.api.schema.tree.CursorAwareDataTreeSnapshot; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshotCursor; import org.opendaylight.yangtools.yang.data.spi.tree.TreeNode; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider; final class InMemoryDataTreeSnapshot extends AbstractCursorAware implements CursorAwareDataTreeSnapshot, EffectiveModelContextProvider { private final @NonNull RootApplyStrategy applyOper; private final @NonNull EffectiveModelContext schemaContext; private final @NonNull TreeNode rootNode; InMemoryDataTreeSnapshot(final EffectiveModelContext schemaContext, final TreeNode rootNode, final RootApplyStrategy applyOper) { this.schemaContext = requireNonNull(schemaContext); this.rootNode = requireNonNull(rootNode); this.applyOper = requireNonNull(applyOper); } TreeNode getRootNode() { return rootNode; } @Override public EffectiveModelContext getEffectiveModelContext() { return schemaContext; } @Override public Optional readNode(final YangInstanceIdentifier path) { return NormalizedNodes.findNode(rootNode.getData(), path); } @Override public InMemoryDataTreeModification newModification() { return new InMemoryDataTreeModification(this, applyOper); } @Override public Optional openCursor(final YangInstanceIdentifier path) { return NormalizedNodes.findNode(rootNode.getData(), path).map(root -> { checkArgument(root instanceof DistinctNodeContainer, "Child %s is not a container", path); return openCursor(new InMemoryDataTreeSnapshotCursor(this, path, (DistinctNodeContainer)root)); }); } @Override public String toString() { return rootNode.getSubtreeVersion().toString(); } }