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.rfc7952.data.util;
10 import static com.google.common.base.Preconditions.checkState;
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableMap;
14 import java.io.IOException;
15 import java.util.ArrayDeque;
16 import java.util.Deque;
17 import java.util.Optional;
18 import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata;
19 import org.opendaylight.yangtools.rfc7952.data.api.StreamWriterMetadataExtension;
20 import org.opendaylight.yangtools.rfc7952.data.util.ImmutableNormalizedMetadata.Builder;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
25 * A simple {@link StreamWriterMetadataExtension} implementation, which takes care of building
26 * {@link NormalizedMetadata} based on additional nesting instructions.
29 public final class ImmutableNormalizedMetadataStreamWriter implements StreamWriterMetadataExtension {
30 private final Deque<Builder> builders = new ArrayDeque<>();
32 private ImmutableNormalizedMetadata result;
34 public void enter(final PathArgument identifier) {
36 builders.push(ImmutableNormalizedMetadata.builder().withIdentifier(identifier));
41 final ImmutableNormalizedMetadata metadata = builders.pop().build();
42 final Builder parent = builders.peek();
44 if (!metadata.getAnnotations().isEmpty()) {
45 parent.withChild(metadata);
52 public Optional<NormalizedMetadata> getResult() {
53 checkState(result != null, "Metadata tree has not been completely built");
54 return result.getAnnotations().isEmpty() ? Optional.empty() : Optional.of(result);
58 public void metadata(final ImmutableMap<QName, Object> metadata) throws IOException {
59 builders.peek().withAnnotations(metadata);
62 private void checkNotDone() {
63 checkState(result != null, "Metadata already completed");