blob: 877c0d25254660cfabe259dd39bec04bd7b2c979 [file] [log] [blame]
/*
* 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.axiom.util.stax.xop;
import java.io.IOException;
import javax.activation.DataHandler;
import javax.xml.namespace.NamespaceContext;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
import org.apache.axiom.util.stax.XMLStreamWriterUtils;
/**
* {@link XMLStreamWriter} wrapper that encodes XOP. It implements the extension
* defined by {@link DataHandlerWriter}. The {@link DataHandler}
* objects for the parts referenced by {@code xop:Include} element information items produced by
* an instance of this class can be retrieved using the {@link #getDataHandler(String)} method.
*/
public class XOPEncodingStreamWriter extends XOPEncodingStreamWrapper
implements XMLStreamWriter, DataHandlerWriter {
private final XMLStreamWriter parent;
/**
* Constructor.
*
* @param parent
* the XML stream to write the encoded infoset to
* @param contentIDGenerator
* used to generate content IDs for the binary content encoded as
* {@code xop:Include} element information items
* @param optimizationPolicy
* the policy to apply to decide which binary content to optimize
*/
public XOPEncodingStreamWriter(XMLStreamWriter parent, ContentIDGenerator contentIDGenerator,
OptimizationPolicy optimizationPolicy) {
super(contentIDGenerator, optimizationPolicy);
this.parent = parent;
}
@Override
public Object getProperty(String name) throws IllegalArgumentException {
if (DataHandlerWriter.PROPERTY.equals(name)) {
return this;
} else {
return parent.getProperty(name);
}
}
private void writeXOPInclude(String contentID) throws XMLStreamException {
String writerPrefix = parent.getPrefix(XOPConstants.NAMESPACE_URI);
if (writerPrefix != null) {
parent.writeStartElement(XOPConstants.NAMESPACE_URI, "Include");
} else {
parent.writeStartElement(XOPConstants.DEFAULT_PREFIX, XOPConstants.INCLUDE,
XOPConstants.NAMESPACE_URI);
parent.setPrefix(XOPConstants.DEFAULT_PREFIX, XOPConstants.NAMESPACE_URI);
parent.writeNamespace(XOPConstants.DEFAULT_PREFIX, XOPConstants.NAMESPACE_URI);
}
parent.writeAttribute(XOPConstants.HREF, XOPUtils.getURLForContentID(contentID));
parent.writeEndElement();
}
@Override
public void writeDataHandler(DataHandler dataHandler, String contentID, boolean optimize)
throws IOException, XMLStreamException {
contentID = processDataHandler(dataHandler, contentID, optimize);
if (contentID != null) {
writeXOPInclude(contentID);
} else {
XMLStreamWriterUtils.writeBase64(parent, dataHandler);
}
}
@Override
public void writeDataHandler(DataHandlerProvider dataHandlerProvider, String contentID,
boolean optimize) throws IOException, XMLStreamException {
contentID = processDataHandler(dataHandlerProvider, contentID, optimize);
if (contentID != null) {
writeXOPInclude(contentID);
} else {
XMLStreamWriterUtils.writeBase64(parent, dataHandlerProvider.getDataHandler());
}
}
@Override
public void close() throws XMLStreamException {
parent.close();
}
@Override
public void flush() throws XMLStreamException {
parent.flush();
}
@Override
public NamespaceContext getNamespaceContext() {
return parent.getNamespaceContext();
}
@Override
public String getPrefix(String uri) throws XMLStreamException {
return parent.getPrefix(uri);
}
@Override
public void setDefaultNamespace(String uri) throws XMLStreamException {
parent.setDefaultNamespace(uri);
}
@Override
public void setNamespaceContext(NamespaceContext context) throws XMLStreamException {
parent.setNamespaceContext(context);
}
@Override
public void setPrefix(String prefix, String uri) throws XMLStreamException {
parent.setPrefix(prefix, uri);
}
@Override
public void writeAttribute(String prefix, String namespaceURI, String localName, String value)
throws XMLStreamException {
parent.writeAttribute(prefix, namespaceURI, localName, value);
}
@Override
public void writeAttribute(String namespaceURI, String localName, String value)
throws XMLStreamException {
parent.writeAttribute(namespaceURI, localName, value);
}
@Override
public void writeAttribute(String localName, String value) throws XMLStreamException {
parent.writeAttribute(localName, value);
}
@Override
public void writeCData(String data) throws XMLStreamException {
parent.writeCData(data);
}
@Override
public void writeCharacters(char[] text, int start, int len) throws XMLStreamException {
parent.writeCharacters(text, start, len);
}
@Override
public void writeCharacters(String text) throws XMLStreamException {
parent.writeCharacters(text);
}
@Override
public void writeComment(String data) throws XMLStreamException {
parent.writeComment(data);
}
@Override
public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException {
parent.writeDefaultNamespace(namespaceURI);
}
@Override
public void writeDTD(String dtd) throws XMLStreamException {
parent.writeDTD(dtd);
}
@Override
public void writeEmptyElement(String prefix, String localName, String namespaceURI)
throws XMLStreamException {
parent.writeEmptyElement(prefix, localName, namespaceURI);
}
@Override
public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
parent.writeEmptyElement(namespaceURI, localName);
}
@Override
public void writeEmptyElement(String localName) throws XMLStreamException {
parent.writeEmptyElement(localName);
}
@Override
public void writeEndDocument() throws XMLStreamException {
parent.writeEndDocument();
}
@Override
public void writeEndElement() throws XMLStreamException {
parent.writeEndElement();
}
@Override
public void writeEntityRef(String name) throws XMLStreamException {
parent.writeEntityRef(name);
}
@Override
public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException {
parent.writeNamespace(prefix, namespaceURI);
}
@Override
public void writeProcessingInstruction(String target, String data) throws XMLStreamException {
parent.writeProcessingInstruction(target, data);
}
@Override
public void writeProcessingInstruction(String target) throws XMLStreamException {
parent.writeProcessingInstruction(target);
}
@Override
public void writeStartDocument() throws XMLStreamException {
parent.writeStartDocument();
}
@Override
public void writeStartDocument(String encoding, String version) throws XMLStreamException {
parent.writeStartDocument(encoding, version);
}
@Override
public void writeStartDocument(String version) throws XMLStreamException {
parent.writeStartDocument(version);
}
@Override
public void writeStartElement(String prefix, String localName, String namespaceURI)
throws XMLStreamException {
parent.writeStartElement(prefix, localName, namespaceURI);
}
@Override
public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
parent.writeStartElement(namespaceURI, localName);
}
@Override
public void writeStartElement(String localName) throws XMLStreamException {
parent.writeStartElement(localName);
}
}