Forward symbolic source in YinDomSchemaSource 63/95863/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 20 Apr 2021 20:47:43 +0000 (22:47 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 20 Apr 2021 22:31:13 +0000 (00:31 +0200)
When we are transforming a source, we should also be forwarding symbolic
name requests.

JIRA: YANGTOOLS-1275
Change-Id: I0aa0420aee4c51d9c006f28b3e669eabc89c1787
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 738badcf0d51117f00d1ee585e546eeb454e22cc)

yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/YinDomSchemaSource.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YinTextToDomTransformer.java

index d32ccd06899dd69eedfc49eade2cc157ce5adc50..fb1187f46277de271325064683cb886eedc48b8f 100644 (file)
@@ -16,6 +16,7 @@ import static org.opendaylight.yangtools.yang.model.api.YangStmtMapping.SUBMODUL
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Optional;
 import javax.xml.transform.Source;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
@@ -53,15 +54,30 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource {
      * @param identifier Schema source identifier
      * @param source W3C DOM source
      * @return A new {@link YinDomSchemaSource} instance.
+     * @deprecated Use {@link #create(SourceIdentifier, DOMSource, String)} instead.
      */
+    @Deprecated(forRemoval = true)
     public static @NonNull YinDomSchemaSource create(final @NonNull SourceIdentifier identifier,
             final @NonNull DOMSource source) {
+        return create(identifier, source, null);
+    }
+
+    /**
+     * Create a new {@link YinDomSchemaSource} using an identifier and a source.
+     *
+     * @param identifier Schema source identifier
+     * @param source W3C DOM source
+     * @param symbolicName Source symbolic name
+     * @return A new {@link YinDomSchemaSource} instance.
+     */
+    public static @NonNull YinDomSchemaSource create(final @NonNull SourceIdentifier identifier,
+            final @NonNull DOMSource source, final @Nullable String symbolicName) {
 
         final Node root = source.getNode().getFirstChild();
         final String rootNs = root.getNamespaceURI();
         if (rootNs == null) {
             // Let whoever is using this deal with this
-            return new Simple(identifier, source);
+            return new Simple(identifier, source, symbolicName);
         }
 
         final QName qname = QName.create(rootNs, root.getLocalName());
@@ -80,7 +96,7 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource {
             REVISION_STMT.getLocalName());
         if (revisions.getLength() == 0) {
             // FIXME: is module name important (as that may have changed)
-            return new Simple(identifier, source);
+            return new Simple(identifier, source, symbolicName);
         }
 
         final Element revisionStmt = (Element) revisions.item(0);
@@ -97,7 +113,7 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource {
             id = identifier;
         }
 
-        return new Simple(id, source);
+        return new Simple(id, source, symbolicName);
     }
 
     /**
@@ -125,7 +141,8 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource {
             throws TransformerException {
         final YinDomSchemaSource cast = castSchemaSource(xmlSchemaSource);
         return cast != null ? cast :
-            create(xmlSchemaSource.getIdentifier(), transformSource(xmlSchemaSource.getSource()));
+            create(xmlSchemaSource.getIdentifier(), transformSource(xmlSchemaSource.getSource()),
+                xmlSchemaSource.getSymbolicName().orElse(null));
     }
 
     @Override
@@ -166,7 +183,8 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource {
 
         final Source source = xmlSchemaSource.getSource();
         if (source instanceof DOMSource) {
-            return create(xmlSchemaSource.getIdentifier(), (DOMSource) source);
+            return create(xmlSchemaSource.getIdentifier(), (DOMSource) source,
+                xmlSchemaSource.getSymbolicName().orElse(null));
         }
 
         return null;
@@ -175,10 +193,13 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource {
     private static final class Simple extends YinDomSchemaSource {
         private final @NonNull SourceIdentifier identifier;
         private final @NonNull DOMSource source;
+        private final String symbolicName;
 
-        Simple(final @NonNull SourceIdentifier identifier, final @NonNull DOMSource source) {
+        Simple(final @NonNull SourceIdentifier identifier, final @NonNull DOMSource source,
+                final @Nullable String symbolicName) {
             this.identifier = requireNonNull(identifier);
             this.source = requireNonNull(source);
+            this.symbolicName = symbolicName;
         }
 
         @Override
@@ -191,6 +212,11 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource {
             return identifier;
         }
 
+        @Override
+        public Optional<String> getSymbolicName() {
+            return Optional.ofNullable(symbolicName);
+        }
+
         @Override
         protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
             return toStringHelper.add("source", source);
@@ -230,6 +256,11 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource {
             return xmlSchemaSource.getIdentifier();
         }
 
+        @Override
+        public Optional<String> getSymbolicName() {
+            return xmlSchemaSource.getSymbolicName();
+        }
+
         @Override
         protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
             return toStringHelper.add("xmlSchemaSource", xmlSchemaSource);
index aa6c332759020ab62d95228d1d20fb4157e43763..239ae3df420fc55b293a6e5a3f0e3d1b91da0689 100644 (file)
@@ -45,6 +45,7 @@ public final class YinTextToDomTransformer extends SchemaSourceTransformer<YinTe
         final SAXParser parser = UntrustedXML.newSAXParser();
         final DefaultHandler handler = new StatementSourceReferenceHandler(doc, null);
         parser.parse(source.openStream(), handler);
-        return YinDomSchemaSource.create(source.getIdentifier(), new DOMSource(doc));
+        return YinDomSchemaSource.create(source.getIdentifier(), new DOMSource(doc),
+            source.getSymbolicName().orElse(null));
     }
 }