import com.google.common.base.Strings;
import java.net.URI;
-import java.util.Map;
-import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.xml.XMLConstants;
final class StreamWriterFacade extends ValueWriter {
private static final Logger LOG = LoggerFactory.getLogger(StreamWriterFacade.class);
private static final Set<String> BROKEN_NAMESPACES = ConcurrentHashMap.newKeySet();
+ private static final Set<String> LEGACY_ATTRIBUTES = ConcurrentHashMap.newKeySet();
private final XMLStreamWriter writer;
private final RandomPrefix prefixes;
prefixes = new RandomPrefix(writer.getNamespaceContext());
}
- @Override
void writeCharacters(final String text) throws XMLStreamException {
if (!Strings.isNullOrEmpty(text)) {
flushElement();
}
}
- void writeAttributes(final Map<QName, String> attributes) throws XMLStreamException {
- flushElement();
- for (final Entry<QName, String> entry : attributes.entrySet()) {
- final QName qname = entry.getKey();
- final String namespace = qname.getNamespace().toString();
-
- if (!Strings.isNullOrEmpty(namespace)) {
- final String prefix = getPrefix(qname.getNamespace(), namespace);
- writer.writeAttribute(prefix, namespace, qname.getLocalName(), entry.getValue());
- } else {
- writer.writeAttribute(qname.getLocalName(), entry.getValue());
- }
- }
- }
-
- private String getPrefix(final URI uri, final String str) throws XMLStreamException {
+ String getPrefix(final URI uri, final String str) throws XMLStreamException {
final String prefix = writer.getPrefix(str);
if (prefix != null) {
return prefix;
void writeStreamReader(final DOMSourceXMLStreamReader reader) throws XMLStreamException {
flushElement();
+ // We track depth, as we do not want to output the top-most element
+ int depth = 0;
while (reader.hasNext()) {
final int event = reader.next();
switch (event) {
case XMLStreamConstants.START_ELEMENT:
- forwardStartElement(reader);
+ if (depth != 0) {
+ forwardStartElement(reader);
+ } else {
+ forwardNamespaces(reader);
+ forwardAttributes(reader);
+ }
+ ++depth;
break;
case XMLStreamConstants.END_ELEMENT:
- writer.writeEndElement();
+ if (depth != 0) {
+ writer.writeEndElement();
+ }
+ --depth;
break;
case XMLStreamConstants.PROCESSING_INSTRUCTION:
forwardProcessingInstruction(reader);
}
}
+ static void warnLegacyAttribute(final String localName) {
+ if (LEGACY_ATTRIBUTES.add(localName)) {
+ LOG.info("Encountered annotation {} not bound to module. Please examine the call stack and fix this "
+ + "warning by defining a proper YANG annotation to cover it", localName,
+ new Throwable("Call stack"));
+ }
+ }
+
private void forwardAttributes(final DOMSourceXMLStreamReader reader) throws XMLStreamException {
- for (int i = 0; i < reader.getAttributeCount(); ++i) {
+ for (int i = 0, count = reader.getAttributeCount(); i < count; ++i) {
final String localName = reader.getAttributeLocalName(i);
final String value = reader.getAttributeValue(i);
final String prefix = reader.getAttributePrefix(i);