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.rcf8528.data.util;
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.annotations.Beta;
14 import java.io.IOException;
15 import org.eclipse.jdt.annotation.NonNull;
16 import org.opendaylight.yangtools.rfc8528.data.api.MountPointNode;
17 import org.opendaylight.yangtools.rfc8528.data.api.StreamWriterMountPointExtension;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
19 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
20 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
22 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
25 * A {@link MountPointNode}-aware counterpart to {@link NormalizedNodeWriter}. Based on the backing writer's capability
26 * it either forwards or filters MountPointNodes.
29 public abstract class MountPointNormalizedNodeWriter extends NormalizedNodeWriter {
30 private static final class Filtering extends MountPointNormalizedNodeWriter {
31 Filtering(final NormalizedNodeStreamWriter writer) {
36 void writeMountPoint(final MountPointNode node) {
41 private static final class Forwarding extends MountPointNormalizedNodeWriter {
42 private final StreamWriterMountPointExtension mountWriter;
44 Forwarding(final NormalizedNodeStreamWriter writer, final StreamWriterMountPointExtension mountWriter) {
46 this.mountWriter = requireNonNull(mountWriter);
50 void writeMountPoint(final MountPointNode node) throws IOException {
51 try (MountPointNormalizedNodeWriter writer = forStreamWriter(mountWriter.startMountPoint(
52 node.getIdentifier(), node.getMountPointContext()))) {
53 for (DataContainerChild<? extends PathArgument, ?> child : node.getValue()) {
60 MountPointNormalizedNodeWriter(final NormalizedNodeStreamWriter writer) {
64 public static @NonNull MountPointNormalizedNodeWriter forStreamWriter(final NormalizedNodeStreamWriter writer) {
65 final StreamWriterMountPointExtension mountWriter = writer.getExtensions()
66 .getInstance(StreamWriterMountPointExtension.class);
67 return mountWriter == null ? new Filtering(writer) : new Forwarding(writer, mountWriter);
70 public static @NonNull MountPointNormalizedNodeWriter filteringFor(final NormalizedNodeStreamWriter writer) {
71 return new Filtering(writer);
74 public static @NonNull MountPointNormalizedNodeWriter forwardingFor(final NormalizedNodeStreamWriter writer) {
75 final StreamWriterMountPointExtension mountWriter = writer.getExtensions()
76 .getInstance(StreamWriterMountPointExtension.class);
77 checkArgument(mountWriter != null, "Writer %s does not support mount points", writer);
78 return new Forwarding(writer, mountWriter);
82 protected final boolean wasProcessedAsCompositeNode(final NormalizedNode<?, ?> node) throws IOException {
83 if (node instanceof MountPointNode) {
84 writeMountPoint((MountPointNode) node);
87 return super.wasProcessedAsCompositeNode(node);
90 abstract void writeMountPoint(MountPointNode node) throws IOException;