/*
* 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.data.impl.schema.transform.dom.parser;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;
import java.util.Collection;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils;
import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher;
import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.YangModeledAnyXmlNodeBaseParser;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class YangModeledAnyXmlDomParser extends YangModeledAnyXmlNodeBaseParser<Element> {
private final NodeParserDispatcher<Element> dispatcher;
public YangModeledAnyXmlDomParser(final NodeParserDispatcher<Element> dispatcher) {
this.dispatcher = Preconditions.checkNotNull(dispatcher);
}
@Override
protected Collection<DataContainerChild<? extends PathArgument, ?>> parseAnyXml(final Element element,
final YangModeledAnyXmlSchemaNode yangModeledAnyXmlSchemaNode) {
final QName qName = yangModeledAnyXmlSchemaNode.getQName();
Preconditions.checkArgument(element.getNodeName().equals(qName.getLocalName()));
Preconditions.checkArgument(element.getNamespaceURI().equals(qName.getNamespace().toString()));
final ContainerSchemaNode schema = yangModeledAnyXmlSchemaNode.getSchemaOfAnyXmlData();
final Builder<DataContainerChild<? extends PathArgument, ?>> value = ImmutableList.builder();
final NodeList childNodes = element.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
final Node node = childNodes.item(i);
if (node instanceof Element) {
final Element elementChild = (Element) node;
final QName elementChildQName = QName.create(elementChild.getNamespaceURI(),
elementChild.getLocalName(), SimpleDateFormatUtil.DEFAULT_DATE_REV);
final DataSchemaNode schemaChild = SchemaUtils.findSchemaForChild(schema, elementChildQName, false);
Preconditions.checkNotNull(schemaChild,
"Unable to find schema for child element %s of yang modeled anyXml data %s.",
elementChild.getLocalName(), yangModeledAnyXmlSchemaNode.getQName());
value.add(dispatcher.dispatchChildElement(schemaChild, ImmutableList.of(elementChild)));
}
}
return value.build();
}
}