/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.axis2.datasource.jaxb; import org.apache.axis2.jaxws.utility.JavaUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.xml.namespace.NamespaceContext; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; /** * On some occasions, JAXB writes out incorrect xmlns and namespace information. This filter is * useful for logging and correcting these kinds of problems. */ class JAXBXMLStreamWriterFilter implements XMLStreamWriter { private static final Log log = LogFactory.getLog(JAXBXMLStreamWriterFilter.class); XMLStreamWriter delegate; int numElements = 0; int numDefaultNS = 0; public JAXBXMLStreamWriterFilter(XMLStreamWriter delegate) { this.delegate = delegate; } public void close() throws XMLStreamException { delegate.close(); } public void flush() throws XMLStreamException { delegate.flush(); } public NamespaceContext getNamespaceContext() { return delegate.getNamespaceContext(); } public String getPrefix(String arg0) throws XMLStreamException { return delegate.getPrefix(arg0); } public Object getProperty(String arg0) throws IllegalArgumentException { return delegate.getProperty(arg0); } public void setDefaultNamespace(String namespaceURI) throws XMLStreamException { if (numElements == 1) { if (log.isDebugEnabled()) { log.debug(" default namespaceURI=" + namespaceURI); } numDefaultNS++; if (numDefaultNS > 1) { // Sometimes JAXB writes out the default namespace twice // This seems to be related to writing out xmlns...see below if (log.isDebugEnabled()) { log.debug(" WHY IS THE DEFAULT NAMESPACE WRITTEN TWICE?"); log.trace(JavaUtils.stackToString()); } return; } } delegate.setDefaultNamespace(namespaceURI); } public void setNamespaceContext(NamespaceContext arg0) throws XMLStreamException { delegate.setNamespaceContext(arg0); } public void setPrefix(String arg0, String arg1) throws XMLStreamException { delegate.setPrefix(arg0, arg1); } public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException { if (numElements == 1) { if (log.isDebugEnabled()) { log.debug(" prefix=" + prefix + " namespace=" + namespaceURI + " localName=" + localName + " value=" + value); } } delegate.writeAttribute(prefix, namespaceURI, localName, value); } public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException { if (numElements == 1) { if (log.isDebugEnabled()) { log.debug(" namespace=" + namespaceURI + " localName=" + localName + " value=" + value); } } delegate.writeAttribute(namespaceURI, localName, value); } public void writeAttribute(String localName, String value) throws XMLStreamException { if (numElements == 1) { if (log.isDebugEnabled()) { log.debug(" localName=" + localName + " value=" + value); } } delegate.writeAttribute(localName, value); } public void writeCData(String arg0) throws XMLStreamException { delegate.writeCData(arg0); } public void writeCharacters(char[] arg0, int arg1, int arg2) throws XMLStreamException { delegate.writeCharacters(arg0, arg1, arg2); } public void writeCharacters(String arg0) throws XMLStreamException { delegate.writeCharacters(arg0); } public void writeComment(String arg0) throws XMLStreamException { delegate.writeComment(arg0); } public void writeDefaultNamespace(String arg0) throws XMLStreamException { delegate.writeDefaultNamespace(arg0); } public void writeDTD(String arg0) throws XMLStreamException { delegate.writeDTD(arg0); } public void writeEmptyElement(String arg0, String arg1, String arg2) throws XMLStreamException { delegate.writeEmptyElement(arg0, arg1, arg2); } public void writeEmptyElement(String arg0, String arg1) throws XMLStreamException { delegate.writeEmptyElement(arg0, arg1); } public void writeEmptyElement(String arg0) throws XMLStreamException { delegate.writeEmptyElement(arg0); } public void writeEndDocument() throws XMLStreamException { delegate.writeEndDocument(); } public void writeEndElement() throws XMLStreamException { delegate.writeEndElement(); } public void writeEntityRef(String arg0) throws XMLStreamException { delegate.writeEntityRef(arg0); } public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException { if (numElements == 1) { if (log.isDebugEnabled()) { log.debug(" prefix=" + prefix + " namespaceURI=" + namespaceURI); } if ("xmlns".equals(prefix)) { // Sometimes JAXB writes out the XMLNS attribute...need to find out why if (log.isDebugEnabled()) { log.debug(" INVALID XMLNS attribute is removed prefix="); log.trace(JavaUtils.stackToString()); } return; } } delegate.writeNamespace(prefix, namespaceURI); } public void writeProcessingInstruction(String arg0, String arg1) throws XMLStreamException { delegate.writeProcessingInstruction(arg0, arg1); } public void writeProcessingInstruction(String arg0) throws XMLStreamException { delegate.writeProcessingInstruction(arg0); } public void writeStartDocument() throws XMLStreamException { delegate.writeStartDocument(); } public void writeStartDocument(String arg0, String arg1) throws XMLStreamException { delegate.writeStartDocument(arg0, arg1); } public void writeStartDocument(String arg0) throws XMLStreamException { delegate.writeStartDocument(arg0); } public void writeStartElement(String prefix, String namespaceURI, String localName) throws XMLStreamException { numElements++; if (numElements == 1) { if (log.isDebugEnabled()) { log.debug(" prefix=" + prefix + " namespace=" + namespaceURI + " localName=" + localName); } } delegate.writeStartElement(prefix, namespaceURI, localName); } public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException { numElements++; if (numElements == 1) { if (log.isDebugEnabled()) { log.debug(" namespace=" + namespaceURI + " localName=" + localName); } } delegate.writeStartElement(namespaceURI, localName); } public void writeStartElement(String localName) throws XMLStreamException { numElements++; if (numElements == 1) { if (log.isDebugEnabled()) { log.debug(" localName=" + localName); } } delegate.writeStartElement(localName); } }