private void fixTypeAttributes()

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));
		}
	}