e0efa40e7bd7b65bf282af1a80d0dd5d65369e6f
[yangtools.git] / model / yang-model-export / src / main / java / org / opendaylight / yangtools / yang / model / export / DeclaredStatementFormatter.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, 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.model.export;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableSet;
14 import java.util.HashSet;
15 import java.util.Set;
16 import org.eclipse.jdt.annotation.NonNullByDefault;
17 import org.opendaylight.yangtools.concepts.Immutable;
18 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
19 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
20 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
22
23 /**
24  * Utility class for formatting {@link DeclaredStatement}s.
25  *
26  * @author Robert Varga
27  */
28 @Beta
29 @NonNullByDefault
30 public final class DeclaredStatementFormatter implements Immutable {
31     private static final DeclaredStatementFormatter DEFAULT = new DeclaredStatementFormatter(ImmutableSet.of(), true);
32
33     private final Set<StatementDefinition> ignoredStatements;
34     private final boolean omitDefaultStatements;
35
36     DeclaredStatementFormatter(final Set<StatementDefinition> ignoredStatements, final boolean omitDefaultStatements) {
37         this.ignoredStatements = requireNonNull(ignoredStatements);
38         this.omitDefaultStatements = omitDefaultStatements;
39     }
40
41     /**
42      * Format specified statement into a {@link YangTextSnippet}.
43      *
44      * @param module parent module
45      * @param statement statement to format
46      * @return A {@link YangTextSnippet}
47      * @throws NullPointerException if any of the arguments is null
48      */
49     public YangTextSnippet toYangTextSnippet(final ModuleEffectiveStatement module,
50             final DeclaredStatement<?> statement) {
51         return new YangTextSnippet(statement, StatementPrefixResolver.forModule(module), ignoredStatements,
52             omitDefaultStatements);
53     }
54
55     public YangTextSnippet toYangTextSnippet(final SubmoduleEffectiveStatement submodule,
56             final DeclaredStatement<?> statement) {
57         return new YangTextSnippet(statement, StatementPrefixResolver.forSubmodule(submodule), ignoredStatements,
58             omitDefaultStatements);
59     }
60
61     /**
62      * Return the default DeclaredStatementFormatter instance. The instance suppresses statements with default values
63      * and does not ignore any statements.
64      *
65      * @return Default-configured instance.
66      */
67     public static DeclaredStatementFormatter defaultInstance() {
68         return DEFAULT;
69     }
70
71     /**
72      * Create a new {@link Builder}, which can be used to create customized DeclaredStatementFormatter instances.
73      *
74      * @return A new Builder.
75      */
76     public static Builder builder() {
77         return new Builder();
78     }
79
80     /**
81      * Builder class for instantiation of a customized {@link DeclaredStatementFormatter}.
82      */
83     @Beta
84     public static final class Builder
85             implements org.opendaylight.yangtools.concepts.Builder<DeclaredStatementFormatter> {
86         private final Set<StatementDefinition> ignoredStatements = new HashSet<>(4);
87         private boolean retainDefaultStatements;
88
89         Builder() {
90
91         }
92
93         /**
94          * Add a statement which should be skipped along with any of its children.
95          *
96          * @param statementDef Statement to be ignored
97          * @return This builder
98          */
99         public Builder addIgnoredStatement(final StatementDefinition statementDef) {
100             ignoredStatements.add(requireNonNull(statementDef));
101             return this;
102         }
103
104         /**
105          * Retain common known statements whose argument matches semantics of not being present. By default these
106          * statements are omitted from output.
107          *
108          * @return This builder
109          */
110         public Builder retainDefaultStatements() {
111             retainDefaultStatements = true;
112             return this;
113         }
114
115         @Override
116         public DeclaredStatementFormatter build() {
117             return new DeclaredStatementFormatter(ImmutableSet.copyOf(ignoredStatements), !retainDefaultStatements);
118         }
119     }
120 }