in taverna-wsdl-generic/src/main/java/org/apache/taverna/wsdl/soap/LiteralBodyBuilder.java [100:153]
private void fixTypeAttributes(Node parent) {
if (parent.getNodeType() == Node.ELEMENT_NODE) {
Element el = (Element) parent;
if (parent.hasAttributes()) {
NamedNodeMap attributes = parent.getAttributes();
List<Node> attributeNodesForRemoval = new ArrayList<Node>();
for (int i = 0; i < attributes.getLength(); i++) {
Node node = attributes.item(i);
if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI.equals(node.getNamespaceURI()) && TYPE.equals(node.getLocalName())) {
// TAV-712 - don't just strip out xsi:type - let's fix the
// name prefixes instead
String xsiType = node.getTextContent();
// Resolve prefix of xsi type
String[] xsiTypeSplitted = xsiType.split(":", 2);
String xsiTypePrefix = "";
String xsiTypeName;
if (xsiTypeSplitted.length == 1) {
// No prefix
xsiTypeName = xsiTypeSplitted[0];
} else {
xsiTypePrefix = xsiTypeSplitted[0];
xsiTypeName = xsiTypeSplitted[1];
}
String xsiTypeNS;
if (parent instanceof SOAPElement) {
xsiTypeNS = ((SOAPElement)parent).getNamespaceURI(xsiTypePrefix);
} else {
xsiTypeNS = node
.lookupNamespaceURI(xsiTypePrefix);
}
// Use global namespace prefixes
String newPrefix = namespaceMappings.get(xsiTypeNS);
if (newPrefix == null) {
logger.warn("Can't find prefix for xsi:type namespace " + xsiTypeNS + " - keeping old " + xsiType);
} else {
String newXsiType = newPrefix + ":" + xsiTypeName;
node.setTextContent(newXsiType);
logger.info("Replacing " + xsiType + " with " + newXsiType);
}
}
}
for (Node node : attributeNodesForRemoval) {
el.removeAttributeNS(node.getNamespaceURI(), node
.getLocalName());
}
}
}
for (int i = 0; i < parent.getChildNodes().getLength(); i++) {
fixTypeAttributes(parent.getChildNodes().item(i));
}
}