/* 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 {@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;
}
}