YANGTOOLS-706: move odlext parser support 62/65462/13
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 12 Nov 2017 20:18:12 +0000 (21:18 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 13 Nov 2017 16:14:31 +0000 (17:14 +0100)
Use composition with a delegator pattern to implement
YangModeledAnyxmlEffectiveStatementImpl. Also adjust the pattern
used to bring in extensions. This forces them to be be aware
of yang-parser-rfc7950, which is fine, as that is the reactor
they can generally expect to be configured.

Change-Id: I91aa95221efb76753d9ea82dc164c1fffc6755c7
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
19 files changed:
common/artifacts/pom.xml
yang/odlext-parser-support/pom.xml [new file with mode: 0644]
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationEffectiveStatementImpl.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/odlext/stmt/AnyxmlSchemaLocationEffectiveStatementImpl.java with 97% similarity]
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationNamespace.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/odlext/namespace/AnyxmlSchemaLocationNamespace.java with 82% similarity]
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationStatementImpl.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/odlext/stmt/AnyxmlSchemaLocationStatementImpl.java with 94% similarity]
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationStatementSupport.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/odlext/stmt/AnyxmlSchemaLocationSupport.java with 78% similarity]
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlStatementSupportOverride.java [new file with mode: 0644]
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/YangModeledAnyxmlEffectiveStatementImpl.java [new file with mode: 0644]
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/package-info.java [new file with mode: 0644]
yang/odlext-parser-support/src/test/java/org/opendaylight/yangtools/odlext/parser/Bug3874ExtensionTest.java [moved from yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug3874ExtensionTest.java with 76% similarity]
yang/odlext-parser-support/src/test/resources/bugs/bug3874/foo.yang [moved from yang/yang-parser-impl/src/test/resources/bugs/bug3874/foo.yang with 100% similarity]
yang/odlext-parser-support/src/test/resources/bugs/bug3874/yang-ext.yang [moved from yang/yang-parser-impl/src/test/resources/bugs/bug3874/yang-ext.yang with 100% similarity]
yang/pom.xml
yang/yang-parser-impl/pom.xml
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/DefaultReactors.java
yang/yang-parser-rfc7950/pom.xml
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/AnyxmlStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/YangModeledAnyXmlEffectiveStatementImpl.java [deleted file]

index bfccdeeee47a97ac9b70e45e4d8572af145c07f4..9f01e69d589e319a3e4f3050d3c0967af954e5bb 100644 (file)
                 <artifactId>odlext-model-api</artifactId>
                 <version>2.0.0-SNAPSHOT</version>
             </dependency>
+            <dependency>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>odlext-parser-support</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
 
             <dependency>
                 <groupId>org.opendaylight.yangtools</groupId>
diff --git a/yang/odlext-parser-support/pom.xml b/yang/odlext-parser-support/pom.xml
new file mode 100644 (file)
index 0000000..3c0a51c
--- /dev/null
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ 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
+-->
+<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>2.0.5</version>
+        <relativePath/>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.opendaylight.yangtools</groupId>
+    <artifactId>odlext-parser-support</artifactId>
+    <version>2.0.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>${project.artifactId}</name>
+    <description>OpenDaylight yang-ext parser support</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>yangtools-artifacts</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+                <scope>import</scope>
+                <type>pom</type>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>concepts</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>yang-common</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>odlext-model-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>yang-parser-rfc7950</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <configuration>
+                    <propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <!--
+        Maven Site Configuration
+
+        The following configuration is necessary for maven-site-plugin to
+        correctly identify the correct deployment path for OpenDaylight Maven
+        sites.
+    -->
+    <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+
+    <distributionManagement>
+        <site>
+            <id>opendaylight-site</id>
+            <url>${nexus.site.url}/${project.artifactId}/</url>
+        </site>
+    </distributionManagement>
+</project>
@@ -5,7 +5,7 @@
  * 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.parser.odlext.stmt;
+package org.opendaylight.yangtools.odlext.parser;
 
 import com.google.common.annotations.VisibleForTesting;
 import java.util.Objects;
@@ -5,13 +5,14 @@
  * 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.parser.odlext.namespace;
+package org.opendaylight.yangtools.odlext.parser;
 
 import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 
 /**
@@ -20,5 +21,5 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 public interface AnyxmlSchemaLocationNamespace extends IdentifierNamespace<StatementDefinition,
     Mutable<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement,
         EffectiveStatement<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement>>> {
-
+    NamespaceBehaviour<?, ?, ?> BEHAVIOR = NamespaceBehaviour.treeScoped(AnyxmlSchemaLocationNamespace.class);
 }
@@ -5,7 +5,7 @@
  * 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.parser.odlext.stmt;
+package org.opendaylight.yangtools.odlext.parser;
 
 import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
@@ -5,32 +5,34 @@
  * 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.parser.odlext.stmt;
+package org.opendaylight.yangtools.odlext.parser;
 
 import static org.opendaylight.yangtools.odlext.model.api.OpenDaylightExtensionsStatements.ANYXML_SCHEMA_LOCATION;
 
 import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.parser.odlext.namespace.AnyxmlSchemaLocationNamespace;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
-public final class AnyxmlSchemaLocationSupport
+public final class AnyxmlSchemaLocationStatementSupport
         extends AbstractStatementSupport<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement,
             EffectiveStatement<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement>> {
-    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(
-        ANYXML_SCHEMA_LOCATION).build();
-    private static final AnyxmlSchemaLocationSupport INSTANCE = new AnyxmlSchemaLocationSupport();
+    private static final AnyxmlSchemaLocationStatementSupport INSTANCE =
+            new AnyxmlSchemaLocationStatementSupport(ANYXML_SCHEMA_LOCATION);
 
-    private AnyxmlSchemaLocationSupport() {
-        super(ANYXML_SCHEMA_LOCATION);
+    private final SubstatementValidator validator;
+
+    private AnyxmlSchemaLocationStatementSupport(final StatementDefinition definition) {
+        super(definition);
+        validator = SubstatementValidator.builder(definition).build();
     }
 
-    public static AnyxmlSchemaLocationSupport getInstance() {
+    public static AnyxmlSchemaLocationStatementSupport getInstance() {
         return INSTANCE;
     }
 
@@ -61,6 +63,6 @@ public final class AnyxmlSchemaLocationSupport
 
     @Override
     protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+        return validator;
     }
 }
\ No newline at end of file
diff --git a/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlStatementSupportOverride.java b/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlStatementSupportOverride.java
new file mode 100644 (file)
index 0000000..dd30539
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2017 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.odlext.parser;
+
+import java.util.Map;
+import java.util.Optional;
+import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml.AnyxmlStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ForwardingStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
+
+public final class AnyxmlStatementSupportOverride
+        extends ForwardingStatementSupport<QName, AnyxmlStatement, AnyxmlEffectiveStatement> {
+    private static final AnyxmlStatementSupportOverride INSTANCE = new AnyxmlStatementSupportOverride();
+
+    private final StatementSupport<QName, AnyxmlStatement, AnyxmlEffectiveStatement> delegate =
+            new AnyxmlStatementSupport();
+
+    private AnyxmlStatementSupportOverride() {
+
+    }
+
+    public static AnyxmlStatementSupportOverride getInstance() {
+        return INSTANCE;
+    }
+
+    @Override
+    protected StatementSupport<QName, AnyxmlStatement, AnyxmlEffectiveStatement> delegate() {
+        return delegate;
+    }
+
+    @Override
+    public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
+        // FIXME: this is not entirely accurate?
+        return delegate.getEffectiveRepresentationClass();
+    }
+
+    @Override
+    public AnyxmlEffectiveStatement createEffective(
+            final StmtContext<QName, AnyxmlStatement, AnyxmlEffectiveStatement> ctx) {
+        final AnyxmlEffectiveStatement delegateStatement = delegate.createEffective(ctx);
+        final Map<StatementDefinition, Mutable<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement,
+            EffectiveStatement<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement>>> schemaLocations =
+                ctx.getAllFromCurrentStmtCtxNamespace(AnyxmlSchemaLocationNamespace.class);
+        if (schemaLocations != null && !schemaLocations.isEmpty()) {
+            final SchemaNodeIdentifier anyXmlSchemaNodeIdentifier = schemaLocations.values().iterator().next()
+                    .getStatementArgument();
+            final Optional<ContainerSchemaNode> anyXmlSchema = getAnyXmlSchema(ctx, anyXmlSchemaNodeIdentifier);
+            if (anyXmlSchema.isPresent()) {
+                return new YangModeledAnyxmlEffectiveStatementImpl(delegateStatement, anyXmlSchema.get());
+            }
+        }
+
+        return delegateStatement;
+    }
+
+    private static Optional<ContainerSchemaNode> getAnyXmlSchema(
+            final StmtContext<QName, AnyxmlStatement, AnyxmlEffectiveStatement> ctx,
+            final SchemaNodeIdentifier contentSchemaPath) {
+        return SchemaNodeIdentifierBuildNamespace.findNode(ctx.getRoot(), contentSchemaPath)
+                .map(StmtContext::buildEffective)
+                .filter(ContainerSchemaNode.class::isInstance).map(ContainerSchemaNode.class::cast);
+    }
+}
diff --git a/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/YangModeledAnyxmlEffectiveStatementImpl.java b/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/YangModeledAnyxmlEffectiveStatementImpl.java
new file mode 100644 (file)
index 0000000..48e7ea5
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2015 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
+ */
+package org.opendaylight.yangtools.odlext.parser;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import javax.annotation.Nonnull;
+import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyXmlSchemaNode;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.MustDefinition;
+import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.meta.ForwardingEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
+
+final class YangModeledAnyxmlEffectiveStatementImpl
+        extends ForwardingEffectiveStatement<QName, AnyxmlStatement, AnyxmlEffectiveStatement>
+        implements YangModeledAnyXmlSchemaNode, AnyxmlEffectiveStatement {
+    private final AnyxmlEffectiveStatement delegate;
+    private final ContainerSchemaNode contentSchema;
+
+    YangModeledAnyxmlEffectiveStatementImpl(final AnyxmlEffectiveStatement delegate,
+        final ContainerSchemaNode contentSchema) {
+        this.delegate = requireNonNull(delegate);
+        this.contentSchema = requireNonNull(contentSchema);
+    }
+
+    @Override
+    protected AnyxmlEffectiveStatement delegate() {
+        return delegate;
+    }
+
+    @Nonnull
+    @Override
+    public ContainerSchemaNode getSchemaOfAnyXmlData() {
+        return contentSchema;
+    }
+
+    private AnyXmlSchemaNode delegateSchemaNode() {
+        return (AnyXmlSchemaNode) delegate;
+    }
+
+    @Override
+    public boolean isConfiguration() {
+        return delegateSchemaNode().isConfiguration();
+    }
+
+    @Override
+    public QName getQName() {
+        return delegateSchemaNode().getQName();
+    }
+
+    @Override
+    public SchemaPath getPath() {
+        return delegateSchemaNode().getPath();
+    }
+
+    @Override
+    public Status getStatus() {
+        return delegateSchemaNode().getStatus();
+    }
+
+    @Override
+    public Optional<String> getDescription() {
+        return delegateSchemaNode().getDescription();
+    }
+
+    @Override
+    public Optional<String> getReference() {
+        return delegateSchemaNode().getReference();
+    }
+
+    @Override
+    public boolean isAugmenting() {
+        return delegateSchemaNode().isAugmenting();
+    }
+
+    @Override
+    public boolean isAddedByUses() {
+        return delegateSchemaNode().isAddedByUses();
+    }
+
+    @Override
+    public Optional<RevisionAwareXPath> getWhenCondition() {
+        return delegateSchemaNode().getWhenCondition();
+    }
+
+    @Override
+    public boolean isMandatory() {
+        return delegateSchemaNode().isConfiguration();
+    }
+
+    @Override
+    public Collection<MustDefinition> getMustConstraints() {
+        return delegateSchemaNode().getMustConstraints();
+    }
+
+    @Override
+    public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+        return delegateSchemaNode().getUnknownSchemaNodes();
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + Objects.hashCode(getQName());
+        result = prime * result + Objects.hashCode(getPath());
+        return result;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+
+        YangModeledAnyxmlEffectiveStatementImpl other = (YangModeledAnyxmlEffectiveStatementImpl) obj;
+        return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
+    }
+
+    @Override
+    public String toString() {
+        return YangModeledAnyxmlEffectiveStatementImpl.class.getSimpleName() + "["
+               + "qname=" + getQName()
+               + ", path=" + getPath()
+               + "]";
+    }
+}
diff --git a/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/package-info.java b/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/package-info.java
new file mode 100644 (file)
index 0000000..09a7e1a
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2017 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
+ */
+/**
+ * YANG parser support for OpenDaylight extensions as defined in yang-ext.yang.
+ *
+ * <p>
+ * To access this extension, add {@link org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationStatementSupport},
+ * {@link org.opendaylight.yangtools.odlext.parser.AnyxmlStatementSupportOverride} and
+ * {@link org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationNamespace#BEHAVIOR} to the reactor.
+ *
+ * @author Robert Varga
+ */
+package org.opendaylight.yangtools.odlext.parser;
similarity index 76%
rename from yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug3874ExtensionTest.java
rename to yang/odlext-parser-support/src/test/java/org/opendaylight/yangtools/odlext/parser/Bug3874ExtensionTest.java
index a4db7f952dff5ded72d54a63a7a19efda29fe6a8..41a309e36920ae722208a9847b58bc2b0696fd2a 100644 (file)
@@ -5,13 +5,14 @@
  * 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.stmt;
+package org.opendaylight.yangtools.odlext.parser;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.net.URI;
 import java.util.List;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.opendaylight.yangtools.odlext.model.api.OpenDaylightExtensionsStatements;
 import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyXmlSchemaNode;
@@ -25,15 +26,28 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
-import org.opendaylight.yangtools.yang.parser.impl.DefaultReactors;
-import org.opendaylight.yangtools.yang.parser.odlext.stmt.AnyxmlSchemaLocationEffectiveStatementImpl;
+import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
 import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
 
 public class Bug3874ExtensionTest {
+    private static CrossSourceStatementReactor reactor;
+
+    @BeforeClass
+    public static void createReactor() {
+        reactor = RFC7950Reactors.vanillaReactorBuilder()
+                .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
+                    AnyxmlSchemaLocationStatementSupport.getInstance())
+                .addNamespaceSupport(ModelProcessingPhase.FULL_DECLARATION, AnyxmlSchemaLocationNamespace.BEHAVIOR)
+                .overrideStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
+                    AnyxmlStatementSupportOverride.getInstance())
+                .build();
+    }
 
     @Test
     public void test() throws Exception {
-        SchemaContext context = DefaultReactors.defaultReactor().newBuild()
+        SchemaContext context = reactor.newBuild()
                 .addSource(YangStatementStreamSource.create(YangTextSchemaSource.forResource("/bugs/bug3874/foo.yang")))
                 .addSource(YangStatementStreamSource.create(
                     YangTextSchemaSource.forResource("/bugs/bug3874/yang-ext.yang")))
index 1f329bb61a453e6663a2a4a090b6da1e083ea93b..806b452c07cc3764ddfbb5e34255f6d48cc0f879 100644 (file)
@@ -64,6 +64,7 @@
 
         <!-- OpenDaylight messy extensions -->
         <module>odlext-model-api</module>
+        <module>odlext-parser-support</module>
 
         <!-- Metadata (annotation) metamodel support -->
         <module>rfc7952-model-api</module>
index fd4ef73af6dc290890746ce6ca8e7e126998e55c..2eacc6910a6de4e7b95614fcb5e57474dbfc32b2 100644 (file)
             <groupId>${project.groupId}</groupId>
             <artifactId>odlext-model-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>odlext-parser-support</artifactId>
+        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>openconfig-model-api</artifactId>
index 4f13cfda6282f25459fdc5ea4cf55b48a2d2e246..81f2c7ccd59ac080337cd992a4606b170806bdeb 100644 (file)
@@ -7,15 +7,14 @@
  */
 package org.opendaylight.yangtools.yang.parser.impl;
 
-import static org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.treeScoped;
-
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationNamespace;
+import org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationStatementSupport;
+import org.opendaylight.yangtools.odlext.parser.AnyxmlStatementSupportOverride;
 import org.opendaylight.yangtools.openconfig.parser.EncryptedValueStatementSupport;
 import org.opendaylight.yangtools.openconfig.parser.HashedValueStatementSupport;
 import org.opendaylight.yangtools.rfc7952.parser.AnnotationStatementSupport;
 import org.opendaylight.yangtools.rfc8040.parser.YangDataStatementSupport;
-import org.opendaylight.yangtools.yang.parser.odlext.namespace.AnyxmlSchemaLocationNamespace;
-import org.opendaylight.yangtools.yang.parser.odlext.stmt.AnyxmlSchemaLocationSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.CustomCrossSourceStatementReactorBuilder;
 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
@@ -54,9 +53,11 @@ public final class DefaultReactors {
     public static CustomCrossSourceStatementReactorBuilder defaultReactorBuilder() {
         return RFC7950Reactors.defaultReactorBuilder()
                 // AnyxmlSchemaLocation support
-                .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, AnyxmlSchemaLocationSupport.getInstance())
-                .addNamespaceSupport(ModelProcessingPhase.FULL_DECLARATION,
-                    treeScoped(AnyxmlSchemaLocationNamespace.class))
+                .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
+                    AnyxmlSchemaLocationStatementSupport.getInstance())
+                .addNamespaceSupport(ModelProcessingPhase.FULL_DECLARATION, AnyxmlSchemaLocationNamespace.BEHAVIOR)
+                .overrideStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
+                    AnyxmlStatementSupportOverride.getInstance())
 
                 // RFC7952 annotation support
                 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, AnnotationStatementSupport.getInstance())
index 101b2e94e96837d013c9207040738a0a815700a0..9101ebd81aecc78751906d27d0952c886817441e 100644 (file)
             <artifactId>yang-data-util</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>odlext-model-api</artifactId>
-        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>openconfig-model-api</artifactId>
                     </excludePackageNames>
                 </configuration>
             </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Export-Package>
-                            {local-packages},
-                            org.opendaylight.yangtools.yang.parser.impl.*,
-                            ;-split-package:=error
-                        </Export-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
         </plugins>
     </build>
 
index 480eb2d8845456890444c89de6933cf661d515d8..21897ca14d4d80adc1f76ea6ece49fbcf3cff961 100644 (file)
@@ -15,7 +15,6 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
@@ -30,8 +29,7 @@ public class AnyxmlEffectiveStatementImpl extends AbstractEffectiveDataSchemaNod
     private final AnyXmlSchemaNode original;
     private final boolean mandatory;
 
-    AnyxmlEffectiveStatementImpl(
-            final StmtContext<QName, AnyxmlStatement, EffectiveStatement<QName, AnyxmlStatement>> ctx) {
+    AnyxmlEffectiveStatementImpl(final StmtContext<QName, AnyxmlStatement, AnyxmlEffectiveStatement> ctx) {
         super(ctx);
         this.original = (AnyXmlSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
         mandatory = findFirstEffectiveSubstatementArgument(MandatoryEffectiveStatement.class).orElse(Boolean.FALSE)
index e0af8827bdb06804089068ebf7f681a235a58588..054570741b80818018daf5b4ce1c97d9816a104d 100644 (file)
@@ -7,28 +7,20 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml;
 
-import java.util.Map;
-import java.util.Optional;
-import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement;
 import org.opendaylight.yangtools.odlext.model.api.OpenDaylightExtensionsStatements;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.parser.odlext.namespace.AnyxmlSchemaLocationNamespace;
 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
-import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
-public final class AnyxmlStatementSupport extends
-        AbstractQNameStatementSupport<AnyxmlStatement, EffectiveStatement<QName, AnyxmlStatement>> {
+public final class AnyxmlStatementSupport
+        extends AbstractQNameStatementSupport<AnyxmlStatement, AnyxmlEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
         .ANYXML)
         .addOptional(YangStmtMapping.CONFIG)
@@ -52,8 +44,7 @@ public final class AnyxmlStatementSupport extends
     }
 
     @Override
-    public void onStatementAdded(final Mutable<QName, AnyxmlStatement,
-            EffectiveStatement<QName, AnyxmlStatement>> stmt) {
+    public void onStatementAdded(final Mutable<QName, AnyxmlStatement, AnyxmlEffectiveStatement> stmt) {
         stmt.getParentContext().addToNs(ChildSchemaNodeNamespace.class, stmt.getStatementArgument(), stmt);
     }
 
@@ -63,30 +54,11 @@ public final class AnyxmlStatementSupport extends
     }
 
     @Override
-    public EffectiveStatement<QName, AnyxmlStatement> createEffective(
-            final StmtContext<QName, AnyxmlStatement, EffectiveStatement<QName, AnyxmlStatement>> ctx) {
-        final Map<StatementDefinition, Mutable<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement,
-            EffectiveStatement<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement>>> schemaLocations =
-            ctx.getAllFromCurrentStmtCtxNamespace(AnyxmlSchemaLocationNamespace.class);
-        if (schemaLocations != null && !schemaLocations.isEmpty()) {
-            final SchemaNodeIdentifier anyXmlSchemaNodeIdentifier = schemaLocations.values().iterator().next()
-                    .getStatementArgument();
-            final Optional<ContainerSchemaNode> anyXmlSchema = getAnyXmlSchema(ctx, anyXmlSchemaNodeIdentifier);
-            if (anyXmlSchema.isPresent()) {
-                return new YangModeledAnyXmlEffectiveStatementImpl(ctx, anyXmlSchema.get());
-            }
-        }
+    public AnyxmlEffectiveStatement createEffective(
+            final StmtContext<QName, AnyxmlStatement, AnyxmlEffectiveStatement> ctx) {
         return new AnyxmlEffectiveStatementImpl(ctx);
     }
 
-    private static Optional<ContainerSchemaNode> getAnyXmlSchema(
-            final StmtContext<QName, AnyxmlStatement, EffectiveStatement<QName, AnyxmlStatement>> ctx,
-            final SchemaNodeIdentifier contentSchemaPath) {
-        return SchemaNodeIdentifierBuildNamespace.findNode(ctx.getRoot(), contentSchemaPath)
-                .map(StmtContext::buildEffective)
-                .filter(ContainerSchemaNode.class::isInstance).map(ContainerSchemaNode.class::cast);
-    }
-
     @Override
     protected SubstatementValidator getSubstatementValidator() {
         return SUBSTATEMENT_VALIDATOR;
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/YangModeledAnyXmlEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/YangModeledAnyXmlEffectiveStatementImpl.java
deleted file mode 100644 (file)
index 971b39b..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2015 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
- */
-package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml;
-
-import static java.util.Objects.requireNonNull;
-
-import java.util.Objects;
-import javax.annotation.Nonnull;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyXmlSchemaNode;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-
-final class YangModeledAnyXmlEffectiveStatementImpl extends AnyxmlEffectiveStatementImpl
-        implements YangModeledAnyXmlSchemaNode {
-
-    private final ContainerSchemaNode schemaOfAnyXmlData;
-
-    YangModeledAnyXmlEffectiveStatementImpl(final StmtContext<QName, AnyxmlStatement,
-            EffectiveStatement<QName, AnyxmlStatement>> ctx, final ContainerSchemaNode contentSchema) {
-        super(ctx);
-        schemaOfAnyXmlData = requireNonNull(contentSchema);
-    }
-
-    @Nonnull
-    @Override
-    public ContainerSchemaNode getSchemaOfAnyXmlData() {
-        return schemaOfAnyXmlData;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + Objects.hashCode(getQName());
-        result = prime * result + Objects.hashCode(getPath());
-        return result;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-
-        YangModeledAnyXmlEffectiveStatementImpl other = (YangModeledAnyXmlEffectiveStatementImpl) obj;
-        return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
-    }
-
-    @Override
-    public String toString() {
-        return YangModeledAnyXmlEffectiveStatementImpl.class.getSimpleName() + "["
-               + "qname=" + getQName()
-               + ", path=" + getPath()
-               + "]";
-    }
-}