/** * */ package org.exist.storage.serializers; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; /** * Add the xmlns:tns and xmlns:soapenc namespaces to the definitions element of the WSDL stylesheet * we do this here as a workaround for Xalan, Xalan has no easy * way to declare additional dynamic namespaces. * There are two possible known Xalan hacks to do this - * * 1) declare a dummy attribute with the namespace. * This seems to break WSDL compatibilty though! * 2) declare a variable containing an element with namespace and copy the * namespace using xsl:copy-of and xalan:nodeset() but this doesnt seem to work! * * http://sources.redhat.com/ml/xsl-list/2001-09/msg01204.html * * If we were using Saxon instead of Xalan then the workaround is easy as XSLT 2.0 * supports xsl:namespace for declaring dynamic namespaces * * * @author Adam Retter (adam.retter@devon.gov.uk) */ public class WSDLFilter implements ContentHandler { protected ContentHandler outputHandler = null; protected String tnsNamespaceUri = null; protected final static String soapencNamespaceUri = "http://schemas.xmlsoap.org/soap/encoding/"; public WSDLFilter(ContentHandler outputHandler, String tnsNamespaceUri) { this.outputHandler = outputHandler; this.tnsNamespaceUri = tnsNamespaceUri; } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator) */ public void setDocumentLocator(Locator locator) { outputHandler.setDocumentLocator(locator); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startDocument() */ public void startDocument() throws SAXException { outputHandler.startDocument(); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endDocument() */ public void endDocument() throws SAXException { outputHandler.endDocument(); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String) */ public void startPrefixMapping(String prefix, String uri) throws SAXException { outputHandler.startPrefixMapping(prefix, uri); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String) */ public void endPrefixMapping(String prefix) throws SAXException { outputHandler.endPrefixMapping(prefix); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { if(qName.equals("definitions")) { outputHandler.startPrefixMapping("tns", tnsNamespaceUri); outputHandler.startPrefixMapping("soapenc", soapencNamespaceUri); } outputHandler.startElement(uri, localName, qName, atts); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) */ public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("definitions")) { outputHandler.endPrefixMapping("tns"); outputHandler.endPrefixMapping("soapenc"); } outputHandler.endElement(uri, localName, qName); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#characters(char[], int, int) */ public void characters(char[] ch, int start, int length) throws SAXException { outputHandler.characters(ch, start, length); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int) */ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { outputHandler.ignorableWhitespace(ch, start, length); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String) */ public void processingInstruction(String target, String data) throws SAXException { outputHandler.processingInstruction(target, data); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String) */ public void skippedEntity(String name) throws SAXException { outputHandler.skippedEntity(name); } }