/******************************************************************************* * Copyright (c) 2005 IBM Corporation 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 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.model.extensions; import java.io.InputStreamReader; import java.io.StringBufferInputStream; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.wsdl.WSDLException; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.ExtensionRegistry; import javax.wsdl.extensions.UnknownExtensionSerializer; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.xerces.jaxp.DocumentBuilderFactoryImpl; import org.apache.xerces.util.DOMUtil; import org.eclipse.bpel.model.Process; import org.eclipse.bpel.model.resource.BPELWriter; import org.eclipse.bpel.model.util.BPELUtils; import org.eclipse.wst.wsdl.UnknownExtensibilityElement; import org.eclipse.xsd.util.XSDConstants; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import com.ibm.wsdl.util.xml.DOM2Writer; public class BPELUnknownExtensionSerializer extends UnknownExtensionSerializer implements BPELExtensionSerializer { public void marshall(Class parentType, QName elementType, ExtensibilityElement extension, Node parentNode, Process process, ExtensionRegistry extReg, BPELWriter bpelWriter) throws WSDLException { Map<String,String> nsMap = BPELUtils.getNamespaceMap(process); Element unknownElement = null; if (elementType.getLocalPart().equals("extensibilityAttributes")) { UnknownExtensibilityElement unknownExt = (UnknownExtensibilityElement) extension; DOMUtil.copyInto(unknownExt.getElement(), parentNode); } else { UnknownExtensibilityElement unknownExt = (UnknownExtensibilityElement) extension; unknownElement = unknownExt.getElement(); } if (unknownElement != null) { StringWriter writer = new StringWriter(); writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); DOM2Writer.serializeAsXML(unknownElement, writer); Document document = load(writer); Element element = document.getDocumentElement(); // remove any ns prefix that has already existed in the process level removeRepeatedNamespaceDecl(element, nsMap); DOMUtil.copyInto(element, parentNode); } } protected void removeRepeatedNamespaceDecl(Element element, Map nsMap) { List removeList = new ArrayList(); NamedNodeMap nodeMap = element.getAttributes(); for (int i=0; i < nodeMap.getLength(); i++) { Attr attr = (Attr)nodeMap.item(i); String nsURI = attr.getNamespaceURI(); String name = attr.getLocalName(); String value = attr.getValue(); if (XSDConstants.XMLNS_URI_2000.equals(nsURI)) { if (nsMap.containsKey(name) && value.equals(nsMap.get(name))) removeList.add(attr); } } for (int i=0; i < removeList.size(); i++) { element.removeAttributeNode((Attr)removeList.get(i)); } NodeList children = element.getChildNodes(); for (int i=0; i < children.getLength(); i++) { if (children.item(i) instanceof Element) removeRepeatedNamespaceDecl((Element)children.item(i), nsMap); } } protected Document load(StringWriter writer) { // Create DOM document DocumentBuilderFactory factory = new DocumentBuilderFactoryImpl(); factory.setNamespaceAware(true); factory.setValidating(false); try { StringBufferInputStream stream = new StringBufferInputStream(writer.getBuffer().toString()); DocumentBuilder builder = factory.newDocumentBuilder(); InputStreamReader reader = new InputStreamReader(stream, "UTF8"); InputSource source = new InputSource(reader); source.setEncoding("UTF8"); Document document = builder.parse(source); return document; } catch (Exception e) { return null; } } }