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.impl.schema;
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.ArrayDeque;
16 import java.util.Deque;
17 import java.util.List;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.opendaylight.yangtools.yang.common.MountPointLabel;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
21 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
23 import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeBuilder;
24 import org.opendaylight.yangtools.yang.data.api.schema.stream.ForwardingNormalizedNodeStreamWriter;
25 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
26 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter.MountPointExtension;
27 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedMountpoints.Builder;
29 // FIXME: document usage of this
31 public abstract class ImmutableMountPointNormalizedNodeStreamWriter extends ImmutableNormalizedNodeStreamWriter
32 implements MountPointExtension {
34 private record BuilderEntry(PathArgument identifier, Builder builder) {
36 requireNonNull(identifier);
37 requireNonNull(builder);
41 private final Deque<BuilderEntry> builders = new ArrayDeque<>();
42 private final NormalizationResultHolder holder;
44 protected ImmutableMountPointNormalizedNodeStreamWriter(final NormalizationResultHolder holder) {
46 this.holder = requireNonNull(holder);
50 public final List<MountPointExtension> supportedExtensions() {
55 public final NormalizedNodeStreamWriter startMountPoint(final MountPointLabel label,
56 final MountPointContext mountCtx) {
57 final var current = builders.peek();
58 checkState(current != null, "Attempted to emit mount point when no data is open");
60 final var mountResult = new NormalizationResultHolder();
61 final var mountDelegate = ImmutableNormalizedNodeStreamWriter.from(mountResult);
63 return new ForwardingNormalizedNodeStreamWriter() {
65 protected NormalizedNodeStreamWriter delegate() {
70 public void close() throws IOException {
73 final var result = mountResult.getResult();
74 final var data = result.data();
75 if (!(data instanceof ContainerNode container)) {
76 throw new IOException("Unhandled mount data " + data);
79 current.builder.withMountPoint(new ImmutableNormalizedMountPoint(label, mountCtx, container,
80 result.metadata(), result.mountPoints()));
86 @SuppressWarnings("rawtypes")
87 final void enter(final PathArgument identifier, final NormalizedNodeBuilder next) {
88 super.enter(identifier, next);
89 builders.push(new BuilderEntry(identifier, ImmutableNormalizedMountpoints.builder()));
93 public final void endNode() {
96 final var last = builders.pop();
97 final var mountPoints = last.builder.build();
98 final var current = builders.peek();
99 if (current != null) {
100 if (mountPoints.mountPoint() != null || !mountPoints.getChildren().isEmpty()) {
101 current.builder.withChild(last.identifier, mountPoints);
105 holder.setMountPoints(mountPoints);