blob: 774871f932d333844f4ca32455b9e4021404751e [file] [log] [blame]
/*******************************************************************************
* 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;
}
}
}