Merge "Add a failure message when compilation test fails"
authorTony Tkacik <ttkacik@cisco.com>
Wed, 7 Jan 2015 09:22:57 +0000 (09:22 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 7 Jan 2015 09:22:58 +0000 (09:22 +0000)
14 files changed:
code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/BindingCodecContext.java
code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/SchemaRootCodecContext.java
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/GeneratedClassLoadingStrategy.java
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java
code-generator/binding-parent/pom.xml
code-generator/binding-parent/src/main/yang/.gitignore [deleted file]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/ValueNode.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedValueAttrNode.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/OperationWithModification.java
yang/yang-maven-plugin-it/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/it/YangToSourcesPluginTestIT.java
yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/Util.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java

index 11f8d3f5bae2c0e9ead199655c2ee052bd0e5ee8..0ecb622367bd7e29ddee09742725e279d673a76a 100644 (file)
@@ -59,19 +59,20 @@ import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-class BindingCodecContext implements CodecContextFactory, Immutable {
+final class BindingCodecContext implements CodecContextFactory, Immutable {
     private static final Logger LOG = LoggerFactory.getLogger(BindingCodecContext.class);
     private static final String GETTER_PREFIX = "get";
 
-    private final SchemaRootCodecContext root;
-    private final BindingRuntimeContext context;
     private final Codec<YangInstanceIdentifier, InstanceIdentifier<?>> instanceIdentifierCodec =
             new InstanceIdentifierCodec();
-    private final Codec<QName, Class<?>> identityCodec = new IdentityCodec();
+    private final Codec<QName, Class<?>> identityCodec;
+    private final BindingRuntimeContext context;
+    private final SchemaRootCodecContext root;
 
     public BindingCodecContext(final BindingRuntimeContext context) {
         this.context = Preconditions.checkNotNull(context, "Binding Runtime Context is required.");
         this.root = SchemaRootCodecContext.create(this);
+        this.identityCodec = new IdentityCodec(context);
     }
 
     @Override
@@ -315,7 +316,12 @@ class BindingCodecContext implements CodecContextFactory, Immutable {
         }
     }
 
-    private class IdentityCodec implements Codec<QName, Class<?>> {
+    private static class IdentityCodec implements Codec<QName, Class<?>> {
+        private final BindingRuntimeContext context;
+
+        IdentityCodec(final BindingRuntimeContext context) {
+            this.context = Preconditions.checkNotNull(context);
+        }
 
         @Override
         public Class<?> deserialize(final QName input) {
index be328ca199ddd388df298159df847e3d90b6f46d..1fafb40ac4a1408a3d0c2656c934b8bde16a1b92 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.DataRoot;
 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
@@ -26,7 +26,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 class SchemaRootCodecContext extends DataContainerCodecContext<SchemaContext> {
 
-    private final LoadingCache<Class<?>, DataContainerCodecContext<?>> children = CacheBuilder.newBuilder().build(
+    private final LoadingCache<Class<?>, DataContainerCodecContext<?>> childrenByClass = CacheBuilder.newBuilder().build(
             new CacheLoader<Class<?>, DataContainerCodecContext<?>>() {
                 @Override
                 public DataContainerCodecContext<?> load(final Class<?> key) {
@@ -38,6 +38,22 @@ class SchemaRootCodecContext extends DataContainerCodecContext<SchemaContext> {
                 }
             });
 
+    private final LoadingCache<QName, DataContainerCodecContext<?>> childrenByQName = CacheBuilder.newBuilder().build(
+        new CacheLoader<QName, DataContainerCodecContext<?>>() {
+            @Override
+            public DataContainerCodecContext<?> load(final QName qname) {
+                final DataSchemaNode childSchema = schema().getDataChildByName(qname);
+                Preconditions.checkArgument(childSchema != null, "Argument %s is not valid child of %s", qname, schema());
+
+                if (childSchema instanceof DataNodeContainer || childSchema instanceof ChoiceNode) {
+                    final Class<?> childCls = factory().getRuntimeContext().getClassForSchema(childSchema);
+                    return getStreamChild(childCls);
+                } else {
+                    throw new UnsupportedOperationException("Unsupported child type " + childSchema.getClass());
+                }
+            }
+        });
+
     private SchemaRootCodecContext(final DataContainerCodecPrototype<SchemaContext> dataPrototype) {
         super(dataPrototype);
     }
@@ -56,7 +72,7 @@ class SchemaRootCodecContext extends DataContainerCodecContext<SchemaContext> {
 
     @Override
     protected DataContainerCodecContext<?> getStreamChild(final Class<?> childClass) {
-        return children.getUnchecked(childClass);
+        return childrenByClass.getUnchecked(childClass);
     }
 
     @Override
@@ -65,23 +81,13 @@ class SchemaRootCodecContext extends DataContainerCodecContext<SchemaContext> {
     }
 
     @Override
-    protected YangInstanceIdentifier.PathArgument getDomPathArgument() {
+    protected PathArgument getDomPathArgument() {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    protected NodeCodecContext getYangIdentifierChild(final YangInstanceIdentifier.PathArgument arg) {
-        // FIXME: Optimize this
-        QName childQName = arg.getNodeType();
-        DataSchemaNode childSchema = schema().getDataChildByName(childQName);
-        Preconditions.checkArgument(childSchema != null, "Argument %s is not valid child of %s", arg, schema());
-        if (childSchema instanceof DataNodeContainer || childSchema instanceof ChoiceNode) {
-            Class<?> childCls = factory().getRuntimeContext().getClassForSchema(childSchema);
-            DataContainerCodecContext<?> childNode = getStreamChild(childCls);
-            return childNode;
-        } else {
-            throw new UnsupportedOperationException();
-        }
+    protected NodeCodecContext getYangIdentifierChild(final PathArgument arg) {
+        return childrenByQName.getUnchecked(arg.getNodeType());
     }
 
     @Override
index 5440e0151141d8e744abdf428b9d2ecb3ec21b1b..d8f3b737980f4fa2d744094883dd870ed33f8703 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.yangtools.sal.binding.generator.impl;
 
 import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy;
 import org.opendaylight.yangtools.sal.binding.model.api.Type;
-import org.opendaylight.yangtools.yang.binding.util.ClassLoaderUtils;
+import org.opendaylight.yangtools.util.ClassLoaderUtils;
 
 public abstract class GeneratedClassLoadingStrategy implements ClassLoadingStrategy {
 
index 4a3d760172a379497a3e0d5408178285317abbe4..fe2510857f89911223c90a539e326c6e25f5e740 100644 (file)
@@ -9,6 +9,9 @@ package org.opendaylight.yangtools.sal.binding.generator.util;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
 import com.google.common.collect.BiMap;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.HashBiMap;
@@ -79,6 +82,20 @@ public class BindingRuntimeContext implements Immutable {
     private final Multimap<Type, Type> choiceToCases = HashMultimap.create();
     private final Map<QName, Type> identities = new HashMap<>();
 
+    private final LoadingCache<QName, Class<?>> identityClasses = CacheBuilder.newBuilder().weakValues().build(
+        new CacheLoader<QName, Class<?>>() {
+            @Override
+            public Class<?> load(final QName key) {
+                final Type identityType = identities.get(key);
+                Preconditions.checkArgument(identityType != null, "Supplied QName %s is not a valid identity", key);
+                try {
+                    return strategy.loadClass(identityType);
+                } catch (ClassNotFoundException e) {
+                    throw new IllegalArgumentException("Required class " + identityType + "was not found.", e);
+                }
+            }
+        });
+
     private BindingRuntimeContext(final ClassLoadingStrategy strategy, final SchemaContext schema) {
         this.strategy = strategy;
         this.schemaContext = schema;
@@ -367,13 +384,6 @@ public class BindingRuntimeContext implements Immutable {
     }
 
     public Class<?> getIdentityClass(final QName input) {
-        Type identityType = identities.get(input);
-        Preconditions.checkArgument(identityType != null, "Supplied QName %s is not a valid identity", input);
-        try {
-            return strategy.loadClass(identityType);
-        } catch (ClassNotFoundException e) {
-            throw new IllegalArgumentException("Required class " + identityType + "was not found.",e);
-        }
+        return identityClasses.getUnchecked(input);
     }
-
 }
index c6b6cf35813692a21f1a2811d1e156051544e4b3..d274762ca989790e94fdc23364e8163dfeb36ccc 100644 (file)
@@ -9,88 +9,103 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-  <parent>
-    <groupId>org.opendaylight.odlparent</groupId>
-    <artifactId>bundle-parent</artifactId>
-    <version>1.5.0-SNAPSHOT</version>
-    <relativePath/>
-  </parent>
+    <parent>
+        <groupId>org.opendaylight.odlparent</groupId>
+        <artifactId>bundle-parent</artifactId>
+        <version>1.5.0-SNAPSHOT</version>
+        <relativePath/>
+    </parent>
 
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.opendaylight.yangtools</groupId>
-  <artifactId>binding-parent</artifactId>
-  <version>0.7.0-SNAPSHOT</version>
-  <packaging>pom</packaging>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.opendaylight.yangtools</groupId>
+    <artifactId>binding-parent</artifactId>
+    <version>0.7.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
 
-  <properties>
-    <yangtools.version>0.7.0-SNAPSHOT</yangtools.version>
-    <salGeneratorPath>src/main/yang-gen-sal</salGeneratorPath>
-  </properties>
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.opendaylight.yangtools</groupId>
-        <artifactId>yangtools-artifacts</artifactId>
-        <version>${yangtools.version}</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.opendaylight.yangtools</groupId>
-          <artifactId>yang-maven-plugin</artifactId>
-          <version>${yangtools.version}</version>
-          <dependencies>
-            <dependency>
-              <groupId>org.opendaylight.yangtools</groupId>
-              <artifactId>maven-sal-api-gen-plugin</artifactId>
-              <version>${yangtools.version}</version>
-              <type>jar</type>
-            </dependency>
-          </dependencies>
-          <executions>
-            <execution>
-              <id>binding</id>
-              <goals>
-                <goal>generate-sources</goal>
-              </goals>
-              <configuration>
-                <codeGenerators>
-                  <generator>
-                    <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
-                    <outputBaseDir>${salGeneratorPath}</outputBaseDir>
-                  </generator>
-                </codeGenerators>
-                <inspectDependencies>true</inspectDependencies>
-              </configuration>
-            </execution>
-          </executions>
-        </plugin>
-        <plugin>
-          <artifactId>maven-clean-plugin</artifactId>
-          <configuration>
-            <filesets>
-              <fileset>
-                <directory>${salGeneratorPath}</directory>
-                <includes>
-                  <include>**</include>
-                </includes>
-              </fileset>
-            </filesets>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-    <plugins>
-      <plugin>
-        <groupId>org.opendaylight.yangtools</groupId>
-        <artifactId>yang-maven-plugin</artifactId>
-        <version>${yangtools.version}</version>
-      </plugin>
-    </plugins>
-  </build>
+    <properties>
+        <yangtools.version>0.7.0-SNAPSHOT</yangtools.version>
+        <salGeneratorPath>src/main/yang-gen-sal</salGeneratorPath>
+    </properties>
+    <profiles>
+        <profile>
+            <activation>
+                <file>
+                    <exists>src/main/yang</exists>
+                </file>
+            </activation>
+            <dependencyManagement>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.opendaylight.yangtools</groupId>
+                        <artifactId>yangtools-artifacts</artifactId>
+                        <version>${yangtools.version}</version>
+                        <type>pom</type>
+                        <scope>import</scope>
+                    </dependency>
+                </dependencies>
+            </dependencyManagement>
+            <dependencies>
+              <dependency>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>yang-binding</artifactId>
+              </dependency>
+            </dependencies>
+            <build>
+                <pluginManagement>
+                    <plugins>
+                        <plugin>
+                            <groupId>org.opendaylight.yangtools</groupId>
+                            <artifactId>yang-maven-plugin</artifactId>
+                            <version>${yangtools.version}</version>
+                            <dependencies>
+                                <dependency>
+                                    <groupId>org.opendaylight.yangtools</groupId>
+                                    <artifactId>maven-sal-api-gen-plugin</artifactId>
+                                    <version>${yangtools.version}</version>
+                                    <type>jar</type>
+                                </dependency>
+                            </dependencies>
+                            <executions>
+                                <execution>
+                                    <id>binding</id>
+                                    <goals>
+                                        <goal>generate-sources</goal>
+                                    </goals>
+                                    <configuration>
+                                        <codeGenerators>
+                                            <generator>
+                                                <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
+                                                <outputBaseDir>${salGeneratorPath}</outputBaseDir>
+                                            </generator>
+                                        </codeGenerators>
+                                        <inspectDependencies>true</inspectDependencies>
+                                    </configuration>
+                                </execution>
+                            </executions>
+                        </plugin>
+                      <plugin>
+                        <artifactId>maven-clean-plugin</artifactId>
+                        <configuration>
+                          <filesets>
+                            <fileset>
+                              <directory>${salGeneratorPath}</directory>
+                              <includes>
+                                <include>**</include>
+                              </includes>
+                            </fileset>
+                          </filesets>
+                        </configuration>
+                      </plugin>
+                    </plugins>
+                </pluginManagement>
+              <plugins>
+                <plugin>
+                  <groupId>org.opendaylight.yangtools</groupId>
+                  <artifactId>yang-maven-plugin</artifactId>
+                  <version>${yangtools.version}</version>
+                </plugin>
+              </plugins>
+            </build>
+        </profile>
+    </profiles>
 </project>
diff --git a/code-generator/binding-parent/src/main/yang/.gitignore b/code-generator/binding-parent/src/main/yang/.gitignore
deleted file mode 100644 (file)
index e50f3cf..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Copyright (c) 2013 Cisco Systems, Inc. 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
-#
-
index cf94651ba08eb5451963db6d7ccd105dfd376606..ebf050859a555d17695f2d0cb9b1a34417f68f30 100644 (file)
@@ -12,7 +12,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;import java.lang.Override;import java.lang.String;import java.lang.UnsupportedOperationException;
+import com.google.common.base.Optional;
 
 /**
  * Concretization of AbstractTreeNode for leaf nodes which only contain data.
index 52eb7650f12ac363ff5027a5fe29e4a3e88805b1..8f9e1019e5c118ce33efd08cf18dd9d9ac982a45 100644 (file)
@@ -7,11 +7,9 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.schema.nodes;
 
-import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.collect.ImmutableMap;
 
-import java.util.Arrays;
 import java.util.Map;
 
 import org.opendaylight.yangtools.yang.common.QName;
index ecda366de034c91513cbe452c8841e121c055179..bc6b46d46f6c05f186b5d9511cf9561bb532bec8 100644 (file)
@@ -270,6 +270,19 @@ final class ModifiedNode implements StoreTreeNode<ModifiedNode>, Identifiable<Pa
                 + modificationType + ", childModification=" + children + "]";
     }
 
+    /**
+     * Create a node which will reflect the state of this node, except it will behave as newly-written
+     * value. This is useful only for merge validation.
+     *
+     * @param value Value associated with the node
+     * @return An isolated node. This node should never reach a datatree.
+     */
+    ModifiedNode asNewlyWritten(final NormalizedNode<?, ?> value) {
+        final ModifiedNode ret = new ModifiedNode(getIdentifier(), Optional.<TreeNode>absent(), false);
+        ret.write(value);
+        return ret;
+    }
+
     public static ModifiedNode createUnmodified(final TreeNode metadataTree, final boolean isOrdered) {
         return new ModifiedNode(metadataTree.getIdentifier(), Optional.of(metadataTree), isOrdered);
     }
index bcf2101ff07d49572d3cbdb8a92cc3e849dbfc45..3293a05b066edea7cc77a9e51796794063fd4c4c 100644 (file)
@@ -31,13 +31,13 @@ final class OperationWithModification {
         applyOperation.verifyStructure(modification);
     }
 
-    private void mergeImpl(final NormalizedNode<?,?> data) {
+    private void recursiveMerge(final NormalizedNode<?,?> data) {
         if (data instanceof NormalizedNodeContainer<?,?,?>) {
             @SuppressWarnings({ "rawtypes", "unchecked" })
             NormalizedNodeContainer<?,?,NormalizedNode<PathArgument, ?>> dataContainer = (NormalizedNodeContainer) data;
             for (NormalizedNode<PathArgument, ?> child : dataContainer.getValue()) {
                 PathArgument childId = child.getIdentifier();
-                forChild(childId).mergeImpl(child);
+                forChild(childId).recursiveMerge(child);
             }
         }
 
@@ -45,8 +45,16 @@ final class OperationWithModification {
     }
 
     void merge(final NormalizedNode<?, ?> data) {
-        mergeImpl(data);
-        applyOperation.verifyStructure(modification);
+        /*
+         * A merge operation will end up overwriting parts of the tree, retaining others.
+         * We want to make sure we do not validate the complete resulting structure, but
+         * rather just what was written. In order to do that, we first pretend the data
+         * was written, run verification and then perform the merge -- with the explicit
+         * assumption that adding the newly-validated data with the previously-validated
+         * data will not result in invalid data.
+         */
+        applyOperation.verifyStructure(modification.asNewlyWritten(data));
+        recursiveMerge(data);
     }
 
     void delete() {
index 381274a098c72740672a40ece39870d42439c393..e2d889e78e58c5090c24151096279294621a7b70 100644 (file)
@@ -31,19 +31,9 @@ public class YangToSourcesPluginTestIT {
     // TODO Test yang files in transitive dependencies
 
     @Test
-    public void testYangRootNotExist() throws URISyntaxException {
-        try {
-            setUp("test-parent/YangRootNotExist/", false);
-        } catch (VerificationException e) {
-            assertVerificationException(e,
-                    "[ERROR] yang-to-sources: Unable to parse yang files from ");
-            assertVerificationException(
-                    e,
-                    "Caused by: org.apache.maven.plugin.MojoExecutionException: yang-to-sources: Unable to parse yang files from ");
-            return;
-        }
-
-        fail("Verification exception should have been thrown");
+    public void testYangRootNotExist() throws Exception {
+        Verifier v = setUp("test-parent/YangRootNotExist/", false);
+        v.verifyTextInLog("[WARNING] yang-to-sources: YANG source directory");
     }
 
     @Test
index c577602ad9427f4942ff9c3e0e4af18b8f414147..b9287185b3ba47d9d27adb1d9201f13eadc3d1c0 100644 (file)
@@ -16,6 +16,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
@@ -82,7 +83,10 @@ final class Util {
 
     static Collection<File> listFiles(File root, File[] excludedFiles, Log log) throws FileNotFoundException {
         if (!root.exists()) {
-            throw new FileNotFoundException(root.toString());
+            if (log != null) {
+                log.warn(Util.message("YANG source directory %s not found. No code will be generated.", YangToSourcesProcessor.LOG_PREFIX, root.toString()));
+            }
+            return Collections.emptyList();
         }
         Collection<File> result = new ArrayList<>();
         Collection<File> yangFiles = FileUtils.listFiles(root, new String[] { YANG_SUFFIX }, true);
index 9f59cfd19a7b156619e3bf808cdda35237b7afc3..c50aa3344f2cb877493c826bdc68904209ffc5ea 100644 (file)
@@ -58,7 +58,6 @@ import org.opendaylight.yangtools.yang.model.api.ModuleImport;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.parser.api.YangContextParser;
 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;