Add DeclaredStatementFormatter 66/68466/2
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 21 Feb 2018 14:12:26 +0000 (15:12 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 21 Feb 2018 14:31:38 +0000 (15:31 +0100)
Working with downstreams it became apparent they really are using
same YangTextBuilder customizations across multiple statements.

This patch exposes DeclaredStatementFormatter, which acts as
a customization holder off of which YangTextSnippets can be created.

JIRA: MDSAL-301
Change-Id: I4733313dcb98c9b1d244088b5b46d8a197ab2f5d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/DeclaredStatementFormatter.java [new file with mode: 0644]
yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YangTextSnippet.java
yang/yang-model-export/src/test/java/org/opendaylight/yangtools/yang/model/export/YangTextSnippetTest.java

diff --git a/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/DeclaredStatementFormatter.java b/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/DeclaredStatementFormatter.java
new file mode 100644 (file)
index 0000000..f05e1c0
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2018 Pantheon Technologies, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.model.export;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableSet;
+import java.util.HashSet;
+import java.util.Set;
+import javax.annotation.concurrent.NotThreadSafe;
+import javax.annotation.concurrent.ThreadSafe;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement.QNameModuleToPrefixNamespace;
+
+/**
+ * Utility class for formatting {@link DeclaredStatement}s.
+ *
+ * @author Robert Varga
+ */
+@Beta
+@ThreadSafe
+@NonNullByDefault
+public final class DeclaredStatementFormatter implements Immutable {
+    private static final DeclaredStatementFormatter DEFAULT = new DeclaredStatementFormatter(ImmutableSet.of(), true);
+
+    private final Set<StatementDefinition> ignoredStatements;
+    private final boolean omitDefaultStatements;
+
+    DeclaredStatementFormatter(final Set<StatementDefinition> ignoredStatements, final boolean omitDefaultStatements) {
+        this.ignoredStatements = requireNonNull(ignoredStatements);
+        this.omitDefaultStatements = omitDefaultStatements;
+    }
+
+    /**
+     * Format specified statement into a {@link YangTextSnippet}.
+     *
+     * @param module parent module
+     * @param statement statement to format
+     * @return A {@link YangTextSnippet}
+     * @throws NullPointerException if any of the arguments is null
+     */
+    public YangTextSnippet toYangTextSnippet(final ModuleEffectiveStatement module,
+            final DeclaredStatement<?> statement) {
+        return new YangTextSnippet(statement, module.findAll(QNameModuleToPrefixNamespace.class), ignoredStatements,
+            omitDefaultStatements);
+    }
+
+    /**
+     * Return the default DeclaredStatementFormatter instance. The instance suppresses statements with default values
+     * and does not ignore any statements.
+     *
+     * @return Default-configured instance.
+     */
+    public static DeclaredStatementFormatter defaultInstance() {
+        return DEFAULT;
+    }
+
+    /**
+     * Create a new {@link Builder}, which can be used to create customized DeclaredStatementFormatter instances.
+     *
+     * @return A new Builder.
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Builder class for instantiation of a customized {@link DeclaredStatementFormatter}.
+     */
+    @Beta
+    @NotThreadSafe
+    public static final class Builder
+            implements org.opendaylight.yangtools.concepts.Builder<DeclaredStatementFormatter> {
+        private final Set<StatementDefinition> ignoredStatements = new HashSet<>(4);
+        private boolean retainDefaultStatements;
+
+        Builder() {
+
+        }
+
+        /**
+         * Add a statement which should be skipped along with any of its children.
+         *
+         * @param statementDef Statement to be ignored
+         * @return This builder
+         */
+        public Builder addIgnoredStatement(final StatementDefinition statementDef) {
+            ignoredStatements.add(requireNonNull(statementDef));
+            return this;
+        }
+
+        /**
+         * Retain common known statements whose argument matches semantics of not being present. By default these
+         * statements are omitted from output.
+         *
+         * @return This builder
+         */
+        public Builder retainDefaultStatements() {
+            retainDefaultStatements = true;
+            return this;
+        }
+
+        @Override
+        public DeclaredStatementFormatter build() {
+            return new DeclaredStatementFormatter(ImmutableSet.copyOf(ignoredStatements), !retainDefaultStatements);
+        }
+    }
+}
index 6993381e770a6542a8550a63a26bc3be9dca2741..1b3ad2e0bdc3edbf9fa8f5ddd439cb0c2709e90f 100644 (file)
@@ -12,10 +12,7 @@ import static org.eclipse.jdt.annotation.DefaultLocation.PARAMETER;
 import static org.eclipse.jdt.annotation.DefaultLocation.RETURN_TYPE;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableSet;
-import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.Spliterator;
@@ -30,8 +27,6 @@ import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement.QNameModuleToPrefixNamespace;
 
 /**
  * A YANG text snippet generated from a {@link DeclaredStatement}. Generated {@link #stream()} or {@link #iterator()}
@@ -53,8 +48,7 @@ public final class YangTextSnippet implements Immutable, Iterable<@NonNull Strin
     private final DeclaredStatement<?> statement;
     private final boolean omitDefaultStatements;
 
-    private YangTextSnippet(final DeclaredStatement<?> statement,
-            final Map<QNameModule, @NonNull String> namespaces,
+    YangTextSnippet(final DeclaredStatement<?> statement, final Map<QNameModule, @NonNull String> namespaces,
             final Set<@NonNull StatementDefinition> ignoredStatements, final boolean omitDefaultStatements) {
         this.statement = requireNonNull(statement);
         this.mapper = requireNonNull(namespaces);
@@ -62,10 +56,6 @@ public final class YangTextSnippet implements Immutable, Iterable<@NonNull Strin
         this.omitDefaultStatements = omitDefaultStatements;
     }
 
-    public static Builder builder(final ModuleEffectiveStatement module, final DeclaredStatement<?> statement) {
-        return new Builder(module, statement);
-    }
-
     @Override
     public Iterator<@NonNull String> iterator() {
         return new YangTextSnippetIterator(statement, mapper, ignoredStatements, omitDefaultStatements);
@@ -88,9 +78,10 @@ public final class YangTextSnippet implements Immutable, Iterable<@NonNull Strin
      *
      * @param str String to be checked
      * @return True if the string contains end of line.
+     * @throws NullPointerException if str is null
      */
     public static boolean isEolString(final String str) {
-        return str.charAt(str.length() - 1) == '\n';
+        return !str.isEmpty() && str.charAt(str.length() - 1) == '\n';
     }
 
     @Override
@@ -98,48 +89,4 @@ public final class YangTextSnippet implements Immutable, Iterable<@NonNull Strin
     public String toString() {
         return stream().collect(Collectors.joining());
     }
-
-    /**
-     * Builder class for instantiation of a customized {@link YangTextSnippet}.
-     */
-    @Beta
-    public static final class Builder implements org.opendaylight.yangtools.concepts.Builder<@NonNull YangTextSnippet> {
-        private final List<@NonNull StatementDefinition> ignoredStatements = new ArrayList<>();
-        private final @NonNull DeclaredStatement<?> statement;
-        private final @NonNull ModuleEffectiveStatement module;
-        private boolean retainDefaultStatements;
-
-        Builder(final ModuleEffectiveStatement module, final DeclaredStatement<?> statement) {
-            this.module = requireNonNull(module);
-            this.statement = requireNonNull(statement);
-        }
-
-        /**
-         * Add a statement which should be skipped along with any of its children.
-         *
-         * @param statementDef Statement to be ignored
-         * @return This builder
-         */
-        public Builder addIgnoredStatement(final StatementDefinition statementDef) {
-            ignoredStatements.add(requireNonNull(statementDef));
-            return this;
-        }
-
-        /**
-         * Retain common known statements whose argument matches semantics of not being present. By default these
-         * statements are omitted from output.
-         *
-         * @return This builder
-         */
-        public Builder retainDefaultStatements() {
-            retainDefaultStatements = true;
-            return this;
-        }
-
-        @Override
-        public YangTextSnippet build() {
-            return new YangTextSnippet(statement, module.getAll(QNameModuleToPrefixNamespace.class),
-                ImmutableSet.copyOf(ignoredStatements), !retainDefaultStatements);
-        }
-    }
 }
index 7ae29ed4c6f621b21c1cce6b54ee4f11932713e2..f1740cb470f4a56b24e2c48456227d7f6709d9ad 100644 (file)
@@ -25,7 +25,8 @@ public class YangTextSnippetTest {
             assertTrue(module instanceof ModuleEffectiveStatement);
             final ModuleEffectiveStatement stmt = (ModuleEffectiveStatement) module;
 
-            final String str = YangTextSnippet.builder(stmt, stmt.getDeclared()).build().toString();
+            final String str = DeclaredStatementFormatter.defaultInstance().toYangTextSnippet(stmt, stmt.getDeclared())
+                    .toString();
             assertNotNull(str);
         }
     }