/* Aalto XML processor
 *
 * Copyright (c) 2006- Tatu Saloranta, tatu.saloranta@iki.fi
 *
 * Licensed under the License specified in the file LICENSE which is
 * included with the source code.
 * You may not use this file except in compliance with the License.
 *
 * 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 com.fasterxml.aalto.out;

import javax.xml.namespace.QName;
import javax.xml.stream.*;

import org.codehaus.stax2.ri.typed.AsciiValueEncoder;

import com.fasterxml.aalto.impl.ErrorConsts;

Concrete implementation of StreamWriterBase, which implements basic namespace-aware, non repairing functionality.
/** * Concrete implementation of {@link StreamWriterBase}, which * implements basic namespace-aware, non repairing functionality. */
public final class NonRepairingStreamWriter extends StreamWriterBase { /* /********************************************************************** /* Construction, init /********************************************************************** */ public NonRepairingStreamWriter(WriterConfig cfg, XmlWriter writer, WNameTable symbols) { super(cfg, writer, symbols); } /* /********************************************************************** /* Implementations of abstract methods from base class, Stax 1.0 methods /********************************************************************** */ @Override public void setDefaultNamespace(String uri) throws XMLStreamException { _currElem.setDefaultNsURI(uri); } @Override public void _setPrefix(String prefix, String uri) { _currElem.addPrefix(prefix, uri); } //public void writeAttribute(String localName, String value) @Override public void writeAttribute(String nsURI, String localName, String value) throws XMLStreamException { if (!_stateStartElementOpen) { throwOutputError(ErrorConsts.WERR_ATTR_NO_ELEM); } WName name; if (nsURI == null || nsURI.length() == 0) { name = _symbols.findSymbol(localName); } else { String prefix = _currElem.getExplicitPrefix(nsURI, _rootNsContext); if (prefix == null) { throwOutputError("Unbound namespace URI '"+nsURI+"'"); } name = _symbols.findSymbol(prefix, localName); } _writeAttribute(name, value); } @Override public void writeAttribute(String prefix, String nsURI, String localName, String value) throws XMLStreamException { if (!_stateStartElementOpen) { throwOutputError(ErrorConsts.WERR_ATTR_NO_ELEM); } WName name = (prefix == null || prefix.length() == 0) ? _symbols.findSymbol(localName) : _symbols.findSymbol(prefix, localName); _writeAttribute(name, value); } @Override public void writeDefaultNamespace(String nsURI) throws XMLStreamException { if (!_stateStartElementOpen) { throwOutputError(ErrorConsts.WERR_NS_NO_ELEM); } _writeDefaultNamespace(nsURI); /* 31-Jan-2008, tatus: Stax TCK expects an implicit prefix * addition binding. So let's do that, then */ setDefaultNamespace(nsURI); } //public void writeDTD(String dtd) //public void writeEmptyElement(String localName) @Override public void writeEmptyElement(String nsURI, String localName) throws XMLStreamException { String prefix = _currElem.getPrefix(nsURI); if (prefix == null) { throwOutputError("Unbound namespace URI '"+nsURI+"'"); } WName name; if (prefix.length() == 0) { name = _symbols.findSymbol(localName); prefix = null; } else { name = _symbols.findSymbol(prefix, localName); } _verifyStartElement(prefix, localName); _writeStartTag(name, true, nsURI); } @Override public void writeEmptyElement(String prefix, String localName, String nsURI) throws XMLStreamException { _verifyStartElement(prefix, localName); WName name; if (prefix == null || prefix.length() == 0) { name = _symbols.findSymbol(localName); } else { name = _symbols.findSymbol(prefix, localName); } _writeStartTag(name, true, nsURI); } @Override public void writeNamespace(String prefix, String nsURI) throws XMLStreamException { if (prefix == null || prefix.length() == 0) { writeDefaultNamespace(nsURI); return; } if (!_stateStartElementOpen) { throwOutputError(ErrorConsts.WERR_NS_NO_ELEM); } _writeNamespace(prefix, nsURI); // 31-Jan-2008, tatus: Stax TCK expects an implicit prefix // addition binding. So let's do that, then setPrefix(prefix, nsURI); } //public void writeStartElement(String localName) @Override public void writeStartElement(String nsURI, String localName) throws XMLStreamException { String prefix = _currElem.getPrefix(nsURI); if (prefix == null) { throwOutputError("Unbound namespace URI '"+nsURI+"'"); } WName name; if (prefix.length() == 0) { name = _symbols.findSymbol(localName); prefix = null; } else { name = _symbols.findSymbol(prefix, localName); } _verifyStartElement(prefix, localName); _writeStartTag(name, false); } @Override public void writeStartElement(String prefix, String localName, String nsURI) throws XMLStreamException { _verifyStartElement(prefix, localName); WName name; if (prefix == null || prefix.length() == 0) { name = _symbols.findSymbol(localName); } else { name = _symbols.findSymbol(prefix, localName); } _writeStartTag(name, false, nsURI); } /* /********************************************************************** /* Implementations of abstract methods from base class, Stax2 Typed API Access (v3.0) /********************************************************************** */ @Override public void writeTypedAttribute(String prefix, String nsURI, String localName, AsciiValueEncoder enc) throws XMLStreamException { if (!_stateStartElementOpen) { throwOutputError(ErrorConsts.WERR_ATTR_NO_ELEM); } WName name = (prefix == null || prefix.length() == 0) ? _symbols.findSymbol(localName) : _symbols.findSymbol(prefix, localName); _writeAttribute(name, enc); } @Override protected String _serializeQName(QName name) { String prefix = name.getPrefix(); String local = name.getLocalPart(); if (prefix == null || prefix.length() == 0) { return local; } // Not efficient... but should be ok return prefix + ":" + local; } }