import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
+import java.util.regex.Pattern;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
import org.opendaylight.controller.config.util.xml.XmlUtil;
import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.ModulesState;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.module.list.Module;
+import org.opendaylight.yangtools.util.xml.UntrustedXML;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
import org.xml.sax.SAXException;
/**
public class LibraryModulesSchemas implements NetconfDeviceSchemas {
private static final Logger LOG = LoggerFactory.getLogger(LibraryModulesSchemas.class);
-
+ private static final Pattern DATE_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2})");
private static final SchemaContext LIBRARY_CONTEXT;
static {
/**
* Resolves URLs with YANG schema resources from modules-state. Uses basic http authenticaiton
+ *
* @param url URL pointing to yang library
* @return Resolved URLs with YANG schema resources for all yang modules from yang library
*/
}
private static Optional<NormalizedNode<?, ?>> readXml(final InputStream in) {
- // TODO one module node with bad revision will fail parsing of whole modules-state node
- // we have to parse them one by one and just ignore modules with bad revisions
- // See BUG 8071 https://bugs.opendaylight.org/show_bug.cgi?id=8071
final DomToNormalizedNodeParserFactory parserFactory =
DomToNormalizedNodeParserFactory.getInstance(XmlUtils.DEFAULT_XML_CODEC_PROVIDER, LIBRARY_CONTEXT);
-
try {
+ final DocumentBuilder docBuilder = UntrustedXML.newDocumentBuilder();
+
+ final Document read = docBuilder.parse(in);
+ final Document doc = docBuilder.newDocument();
+ final Element rootElement = doc.createElementNS("urn:ietf:params:xml:ns:yang:ietf-yang-library",
+ "modules");
+ doc.appendChild(rootElement);
+
+ for (int i = 0; i < read.getElementsByTagName("revision").getLength(); i++) {
+ final String revision = read.getElementsByTagName("revision").item(i).getTextContent();
+ if (DATE_PATTERN.matcher(revision).find() || revision.isEmpty()) {
+ final Node module = doc.importNode(read.getElementsByTagName("module").item(i), true);
+ rootElement.appendChild(module);
+ } else {
+ LOG.warn("Xml contains wrong revision - {} - on module {}", revision,
+ read.getElementsByTagName("module").item(i).getTextContent());
+ }
+ }
+
+ final Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ final StringWriter sw = new StringWriter();
+ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ transformer.transform(new DOMSource(doc), new StreamResult(sw));
final NormalizedNode<?, ?> parsed =
- parserFactory.getContainerNodeParser().parse(Collections.singleton(XmlUtil.readXmlToElement(in)),
+ parserFactory.getContainerNodeParser()
+ .parse(Collections.singleton(XmlUtil.readXmlToElement(sw.toString())),
(ContainerSchemaNode) LIBRARY_CONTEXT.getDataChildByName(ModulesState.QNAME));
return Optional.of(parsed);
- } catch (IOException | SAXException e) {
+ } catch (final SAXException | IOException | TransformerException e) {
LOG.warn("Unable to parse yang library xml content", e);
}