Add YangParserConfiguration 75/95875/2
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 21 Apr 2021 10:45:08 +0000 (12:45 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 21 Apr 2021 11:09:53 +0000 (13:09 +0200)
We are heading towards more flexible parser, where some features can be
enabled or disabled. To support that world we need some sort of a
configuration object. This patch introduces such a concept.

JIRA: YANGTOOLS-1193
Change-Id: I7763df6615348d87044646fef46ff0dfda744436
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-api/pom.xml
yang/yang-parser-api/src/main/java/org/opendaylight/yangtools/yang/model/parser/api/YangParserConfiguration.java [new file with mode: 0644]
yang/yang-parser-api/src/main/java/org/opendaylight/yangtools/yang/model/parser/api/YangParserFactory.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserFactoryImpl.java

index 02c5732c91cbaf39c633dc16b7f9605a6736f632..6b6f850d6aca0d1884a332b6129cb7bc8aef53d7 100644 (file)
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>concepts</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-common</artifactId>
diff --git a/yang/yang-parser-api/src/main/java/org/opendaylight/yangtools/yang/model/parser/api/YangParserConfiguration.java b/yang/yang-parser-api/src/main/java/org/opendaylight/yangtools/yang/model/parser/api/YangParserConfiguration.java
new file mode 100644 (file)
index 0000000..7040ab1
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2021 PANTHEON.tech, 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.parser.api;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.model.repo.api.StatementParserMode;
+
+/**
+ * A configuration of {@link YangParser} wiring for use with {@link YangParserFactory}.
+ */
+@Beta
+@NonNullByDefault
+public final class YangParserConfiguration implements Immutable {
+    public static final YangParserConfiguration DEFAULT = new YangParserConfiguration(StatementParserMode.DEFAULT_MODE);
+
+    private final StatementParserMode parserMode;
+
+    private YangParserConfiguration(final StatementParserMode parserMode) {
+        this.parserMode = requireNonNull(parserMode);
+    }
+
+    public StatementParserMode parserMode() {
+        return parserMode;
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static final class Builder implements org.opendaylight.yangtools.concepts.Builder<YangParserConfiguration> {
+        private StatementParserMode parserMode = StatementParserMode.DEFAULT_MODE;
+
+        private Builder() {
+            // Hidden on purpose
+        }
+
+        @Override
+        public YangParserConfiguration build() {
+            return new YangParserConfiguration(parserMode);
+        }
+
+        public Builder setParserMode(final StatementParserMode parserMode) {
+            this.parserMode = requireNonNull(parserMode);
+            return this;
+        }
+    }
+}
index f97e40e97fff2b62be8423c0ba6986c9423a985e..78f827b0979aeba316a78c73a8bfbf021cebae62 100644 (file)
@@ -9,32 +9,41 @@ package org.opendaylight.yangtools.yang.model.parser.api;
 
 import com.google.common.annotations.Beta;
 import java.util.Collection;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.repo.api.StatementParserMode;
 
 /**
  * Basic entry point into a YANG parser implementation. Implementations of this interface are expected to be
  * thread-safe.
- *
- * @author Robert Varga
  */
 @Beta
 public interface YangParserFactory {
     /**
      * Return enumeration of {@link StatementParserMode}s supported by this factory.
      *
-     * @return Enumeration of supported schema source representations.
+     * @return Enumeration of supported schema source representations
      */
     Collection<StatementParserMode> supportedParserModes();
 
     /**
-     * Create a {@link YangParser} instance operating in default import resolution mode.
+     * Create a {@link YangParser} instance operating with default {@link YangParserConfiguration}.
      *
      * @return A new {@link YangParser} instance
      */
-    default YangParser createParser() {
-        return createParser(StatementParserMode.DEFAULT_MODE);
+    default @NonNull YangParser createParser() {
+        return createParser(YangParserConfiguration.DEFAULT);
     }
 
+    /**
+     * Create a {@link YangParser} instance operating with specified {@link YangParserConfiguration}.
+     *
+     * @param configuration Requested parser configuration
+     * @return A new {@link YangParser} instance
+     * @throws NullPointerException if configuration is null
+     * @throws IllegalArgumentException if specified configuration is not supported
+     */
+    @NonNull YangParser createParser(YangParserConfiguration configuration);
+
     /**
      * Create a {@link YangParser} instance operating in specified import resolution mode.
      *
@@ -42,6 +51,10 @@ public interface YangParserFactory {
      * @return A new {@link YangParser} instance
      * @throws NullPointerException if parser mode is null
      * @throws IllegalArgumentException if specified parser mode is not supported
+     * @deprecated Use {@link #createParser(YangParserConfiguration)} instead.
      */
-    YangParser createParser(StatementParserMode parserMode);
+    @Deprecated(forRemoval = true)
+    default @NonNull YangParser createParser(final StatementParserMode parserMode) {
+        return createParser(YangParserConfiguration.builder().setParserMode(parserMode).build());
+    }
 }
index a8e9748b8566a258d490dfe71b9dc2fdaca6e75f..6f393cb99b3aa7d7273a6530a3b94a60e316083b 100644 (file)
@@ -7,16 +7,18 @@
  */
 package org.opendaylight.yangtools.yang.parser.impl;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
 import java.util.Collection;
+import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.kohsuke.MetaInfServices;
 import org.opendaylight.yangtools.yang.model.parser.api.YangParser;
+import org.opendaylight.yangtools.yang.model.parser.api.YangParserConfiguration;
 import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory;
 import org.opendaylight.yangtools.yang.model.repo.api.StatementParserMode;
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
@@ -33,8 +35,10 @@ import org.osgi.service.component.annotations.Reference;
 @Singleton
 @Component(immediate = true)
 public final class YangParserFactoryImpl implements YangParserFactory {
-    private static final ImmutableList<StatementParserMode> SUPPORTED_MODES = ImmutableList.of(
-        StatementParserMode.DEFAULT_MODE, StatementParserMode.SEMVER_MODE);
+    private static final List<StatementParserMode> SUPPORTED_MODES = List.of(
+        StatementParserMode.DEFAULT_MODE,
+        StatementParserMode.SEMVER_MODE);
+
     private final CrossSourceStatementReactor reactor;
 
     private YangParserFactoryImpl(final @NonNull CrossSourceStatementReactor reactor) {
@@ -70,7 +74,9 @@ public final class YangParserFactoryImpl implements YangParserFactory {
     }
 
     @Override
-    public YangParser createParser(final StatementParserMode parserMode) {
-        return new YangParserImpl(reactor.newBuild(parserMode));
+    public @NonNull YangParser createParser(final YangParserConfiguration configuration) {
+        final StatementParserMode mode = configuration.parserMode();
+        checkArgument(SUPPORTED_MODES.contains(mode), "Unsupported parser mode %s", mode);
+        return new YangParserImpl(reactor.newBuild(mode));
     }
 }