2 * Copyright (c) 2019 PANTHEON.tech s.r.o. 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.yangtools.yang.data.util;
10 import static com.google.common.base.Preconditions.checkState;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.annotations.Beta;
14 import java.io.IOException;
15 import java.util.ArrayList;
16 import java.util.EnumMap;
17 import java.util.List;
19 import org.eclipse.jdt.annotation.NonNull;
20 import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
21 import org.opendaylight.yangtools.rfc8528.data.api.MountPointChild;
22 import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
23 import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
24 import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
25 import org.opendaylight.yangtools.rfc8528.data.api.StreamWriterMountPointExtension;
26 import org.opendaylight.yangtools.rfc8528.data.api.YangLibraryConstants.ContainerName;
27 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
28 import org.opendaylight.yangtools.yang.model.parser.api.YangParserException;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
33 * YANG Schema Mount-supported data attached to either a {@code list} item or a {@code container}.
36 public final class MountPointData extends AbstractIdentifiable<MountPointIdentifier> {
37 private static final Logger LOG = LoggerFactory.getLogger(MountPointData.class);
39 private final Map<ContainerName, MountPointChild> yangLib = new EnumMap<>(ContainerName.class);
40 private final List<MountPointChild> children = new ArrayList<>();
41 private final MountPointContextFactory contextFactory;
43 private MountPointChild schemaMounts;
45 MountPointData(final MountPointIdentifier mountId, final MountPointContextFactory contextFactory) {
47 this.contextFactory = requireNonNull(contextFactory);
50 public void setContainer(final @NonNull ContainerName containerName, final @NonNull MountPointChild data) {
51 final MountPointChild prev = yangLib.putIfAbsent(containerName, requireNonNull(data));
52 checkState(prev == null, "Attempted to duplicate container %s data %s with %s", containerName, prev, data);
56 public void setSchemaMounts(final @NonNull MountPointChild data) {
57 checkState(schemaMounts == null, "Attempted to reset schema-mounts from %s to %s", schemaMounts, data);
58 schemaMounts = requireNonNull(data);
62 public void addChild(final @NonNull MountPointChild data) {
63 children.add(requireNonNull(data));
66 void write(final @NonNull NormalizedNodeStreamWriter writer) throws IOException {
67 final StreamWriterMountPointExtension mountWriter = writer.getExtensions()
68 .getInstance(StreamWriterMountPointExtension.class);
69 if (mountWriter == null) {
70 LOG.debug("Writer {} does not support mount points, ignoring data in {}", writer, getIdentifier());
74 final MountPointContext mountCtx;
76 mountCtx = contextFactory.createContext(yangLib, schemaMounts);
77 } catch (YangParserException e) {
78 throw new IOException("Failed to resolve mount point " + getIdentifier(), e);
80 try (NormalizedNodeStreamWriter nestedWriter = mountWriter.startMountPoint(getIdentifier(), mountCtx)) {
81 for (MountPointChild child : children) {
82 child.writeTo(nestedWriter, mountCtx);