blob: b7b49b0bf4f59bf6ee6be5c965b8f027abd78813 [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.om.impl;
import java.io.OutputStream;
import javax.activation.DataHandler;
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.om.OMOutputFormat;
import org.apache.axiom.util.stax.XMLStreamWriterUtils;
/**
* MTOMXMLStreamWriter is an XML + Attachments stream writer.
*
* For the moment this assumes that transport takes the decision of whether to optimize or not by
* looking at whether the MTOM optimize is enabled and also looking at the OM tree whether it has any
* optimizable content.
*/
public abstract class MTOMXMLStreamWriter implements XMLStreamWriter {
/**
* Check if MTOM is enabled.
* <p>
* Note that serialization code should use
* {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, DataHandler, String, boolean)}
* or
* {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, DataHandlerProvider, String, boolean)}
* to submit any binary content and let this writer decide whether the content should be written
* as base64 encoded character data or using {@code xop:Include}. This makes optimization
* entirely transparent for the caller and there should be no need to check if the writer is
* producing MTOM. However, in some cases this is not possible, such as when integrating with
* 3rd party libraries. The serialization code should then use
* {@link #prepareDataHandler(DataHandler)} so that it can write {@code xop:Include} elements
* directly to the stream. In that case, the code may use the {@link #isOptimized()} method
* check if MTOM is enabled at all.
*
* @return <code>true</code> if MTOM is enabled, <code>false</code> otherwise
*/
public abstract boolean isOptimized();
/**
* Prepare a {@link DataHandler} for serialization without using the {@link DataHandlerWriter}
* API. The method first determines whether the binary data represented by the
* {@link DataHandler} should be optimized or inlined. If the data should not be optimized, then
* the method returns <code>null</code> and the caller is expected to use
* {@link #writeCharacters(String)} or {@link #writeCharacters(char[], int, int)} to write the
* base64 encoded data to the stream. If the data should be optimized, then the method returns a
* content ID and the caller is expected to generate an {@code xop:Include} element referring
* to that content ID.
* <p>
* This method should only be used to integrate Axiom with third party libraries that support
* XOP. In all other cases,
* {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, DataHandler, String, boolean)}
* or
* {@link XMLStreamWriterUtils#writeDataHandler(XMLStreamWriter, DataHandlerProvider, String, boolean)}
* should be used to write base64Binary values and the application code should never generate
* {@code xop:Include} elements itself.
*
* @param dataHandler
* the {@link DataHandler} that the caller intends to write to the stream
* @return the content ID that the caller must use in the {@code xop:Include} element or
* <code>null</code> if the base64 encoded data should not be optimized
*/
public abstract String prepareDataHandler(DataHandler dataHandler);
/**
* Returns the character set encoding scheme. If the value of the charSetEncoding is not set
* then the default will be returned.
*
* @return Returns encoding.
*/
public abstract String getCharSetEncoding();
/**
* Get the output format used by this writer.
* <p>
* The caller should use the returned instance in a read-only way, i.e.
* he should not modify the settings of the output format. Any attempt
* to do so will lead to unpredictable results.
*
* @return the output format used by this writer
*/
public abstract OMOutputFormat getOutputFormat();
/**
* Get the underlying {@link OutputStream} for this writer, if available. This method allows a
* node (perhaps an {@link org.apache.axiom.om.OMSourcedElement}) to write its content directly
* to the byte stream.
* <p>
* <b>WARNING:</b> This method should be used with extreme care. The caller must be prepared to
* handle the following issues:
* <ul>
* <li>The caller must use the right charset encoding when writing to the stream.
* <li>The caller should avoid writing byte order marks to the stream.
* <li>The caller must be aware of the fact that a default namespace might have been set in the
* context where the byte stream is requested. If the XML data written to the stream contains
* unqualified elements, then the caller must make sure that the default namespace is redeclared
* as appropriate.
* </ul>
*
* @return the underlying byte stream, or <code>null</code> if the stream is not accessible
*/
public abstract OutputStream getOutputStream() throws XMLStreamException;
}