com.fasterxml.aalto.out.NonRepairingStreamWriter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aalto-xml Show documentation
Show all versions of aalto-xml Show documentation
Ultra-high performance non-blocking XML processor (Stax/Stax2, SAX/SAX2)
/* Aalto XML processor
*
* Copyright (c) 2006- Tatu Saloranta, [email protected]
*
* 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 {@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;
}
}