in core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java [780:887]
private static void writeStartElement(XMLStreamReader reader, XMLStreamWriter writer)
throws XMLStreamException {
String uri = reader.getNamespaceURI();
String prefix = reader.getPrefix();
String local = reader.getLocalName();
if (prefix == null) {
prefix = "";
}
boolean writeElementNS = false;
if (uri != null) {
writeElementNS = true;
Iterator<String> it = CastUtils.cast(writer.getNamespaceContext().getPrefixes(uri));
if (!it.hasNext() && StringUtils.isEmpty(prefix) && StringUtils.isEmpty(uri)
&& StringUtils.isEmpty(writer.getNamespaceContext().getNamespaceURI(""))) {
writeElementNS = false;
}
while (it.hasNext()) {
String s = it.next();
if (s == null) {
s = "";
}
if (s.equals(prefix)) {
writeElementNS = false;
}
}
}
// Write out the element name
if (uri != null) {
if (prefix.isEmpty() && StringUtils.isEmpty(uri)) {
writer.writeStartElement(local);
} else {
writer.writeStartElement(prefix, local, uri);
}
} else {
writer.writeStartElement(local);
}
// Write out the namespaces
for (int i = 0; i < reader.getNamespaceCount(); i++) {
String nsURI = reader.getNamespaceURI(i);
String nsPrefix = reader.getNamespacePrefix(i);
if (nsPrefix == null) {
nsPrefix = "";
}
if (nsURI == null) {
nsURI = "";
}
if (nsPrefix.isEmpty()) {
writer.writeDefaultNamespace(nsURI);
writer.setDefaultNamespace(nsURI);
} else {
writer.writeNamespace(nsPrefix, nsURI);
writer.setPrefix(nsPrefix, nsURI);
}
if (nsURI.equals(uri) && nsPrefix.equals(prefix)) {
writeElementNS = false;
}
}
// Check if the namespace still needs to be written.
// We need this check because namespace writing works
// different on Woodstox and the RI.
if (writeElementNS) {
if (prefix.isEmpty()) {
writer.writeDefaultNamespace(uri);
writer.setDefaultNamespace(uri);
} else {
writer.writeNamespace(prefix, uri);
writer.setPrefix(prefix, uri);
}
}
// Write out attributes
for (int i = 0; i < reader.getAttributeCount(); i++) {
String ns = reader.getAttributeNamespace(i);
String nsPrefix = reader.getAttributePrefix(i);
if (ns == null || ns.isEmpty()) {
writer.writeAttribute(reader.getAttributeLocalName(i), reader.getAttributeValue(i));
} else if (nsPrefix == null || nsPrefix.isEmpty()) {
writer.writeAttribute(reader.getAttributeNamespace(i), reader.getAttributeLocalName(i),
reader.getAttributeValue(i));
} else {
Iterator<String> it = CastUtils.cast(writer.getNamespaceContext().getPrefixes(ns));
boolean writeNs = true;
while (it != null && it.hasNext()) {
String s = it.next();
if (s == null) {
s = "";
}
if (s.equals(nsPrefix)) {
writeNs = false;
}
}
if (writeNs) {
writer.writeNamespace(nsPrefix, ns);
writer.setPrefix(nsPrefix, ns);
}
writer.writeAttribute(reader.getAttributePrefix(i), reader.getAttributeNamespace(i), reader
.getAttributeLocalName(i), reader.getAttributeValue(i));
}
}
}