Clean up more Sonar warnings
[yangtools.git] / data / yang-data-util / src / main / java / org / opendaylight / yangtools / yang / data / util / MountPointData.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech s.r.o. and others. All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.data.util;
9
10 import static com.google.common.base.Preconditions.checkState;
11 import static java.util.Objects.requireNonNull;
12
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;
18 import java.util.Map;
19 import org.eclipse.jdt.annotation.NonNull;
20 import org.opendaylight.yangtools.yang.common.MountPointLabel;
21 import org.opendaylight.yangtools.yang.data.api.schema.MountPointChild;
22 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
23 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory;
24 import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory.ContainerName;
25 import org.opendaylight.yangtools.yang.data.api.schema.MountPointException;
26 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
27 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter.MountPointExtension;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 /**
32  * YANG Schema Mount-supported data attached to either a {@code list} item or a {@code container}.
33  */
34 @Beta
35 public final class MountPointData {
36     private static final Logger LOG = LoggerFactory.getLogger(MountPointData.class);
37
38     private final Map<ContainerName, MountPointChild> yangLib = new EnumMap<>(ContainerName.class);
39     private final List<MountPointChild> children = new ArrayList<>();
40     private final MountPointContextFactory contextFactory;
41     private final @NonNull MountPointLabel label;
42
43     private MountPointChild schemaMounts;
44
45     MountPointData(final MountPointLabel label, final MountPointContextFactory contextFactory) {
46         this.label = requireNonNull(label);
47         this.contextFactory = requireNonNull(contextFactory);
48     }
49
50     public @NonNull MountPointLabel label() {
51         return label;
52     }
53
54     public void setContainer(final @NonNull ContainerName containerName, final @NonNull MountPointChild data) {
55         final MountPointChild prev = yangLib.putIfAbsent(containerName, requireNonNull(data));
56         checkState(prev == null, "Attempted to duplicate container %s data %s with %s", containerName, prev, data);
57         addChild(data);
58     }
59
60     public void setSchemaMounts(final @NonNull MountPointChild data) {
61         checkState(schemaMounts == null, "Attempted to reset schema-mounts from %s to %s", schemaMounts, data);
62         schemaMounts = requireNonNull(data);
63         addChild(data);
64     }
65
66     public void addChild(final @NonNull MountPointChild data) {
67         children.add(requireNonNull(data));
68     }
69
70     void write(final @NonNull NormalizedNodeStreamWriter writer) throws IOException {
71         final var mountWriter = writer.extension(MountPointExtension.class);
72         if (mountWriter == null) {
73             LOG.debug("Writer {} does not support mount points, ignoring data in {}", writer, label);
74             return;
75         }
76
77         final MountPointContext mountCtx;
78         try {
79             mountCtx = contextFactory.createContext(yangLib, schemaMounts);
80         } catch (MountPointException e) {
81             throw new IOException("Failed to resolve mount point " + label, e);
82         }
83         try (NormalizedNodeStreamWriter nestedWriter = mountWriter.startMountPoint(label, mountCtx)) {
84             for (MountPointChild child : children) {
85                 child.writeTo(nestedWriter, mountCtx);
86             }
87         }
88     }
89 }