// 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 com.cloud.bridge.io;
import java.io.IOException;
import java.io.OutputStream;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMFactory;
import org.apache.axis2.databinding.ADBBean;
import org.apache.axis2.databinding.ADBException;
import org.apache.axis2.databinding.utils.writer.MTOMAwareXMLSerializer;
/**
* Provide an MTOM aware serializable output stream writer to be consumed by implementors of the
* com.amazon.s3 Response ADB bean classes.
* This writer enables participation is StaX based builders and AXIOM om xml stream processing
* An instance of a MTOMAwareResultStreamWriter is a convenient argument to a com.amazon.s3 Response bean, as generated
* from the Amazon S3 WSDL using
* wsdl2java.sh -ss -sd -ssi -g -p com.amazon.s3 -ns2p "http://s3.amazonaws.com/doc/2006-03-01/"=com.amazon.s3 -uri cloud-AmazonS3.wsdl
* Such a bean implements a serialize method of the form
* public void serialize(qualifiedName,omfactory, xmlWriter)
* where
* @param qualifiedName is the XML qualified name of the parent
* @param omfactory is an implementor of the AXIOM object model interface
* @param xmlWriter is an implementor of XMLStxreamWriter for writing plain XML
* A convenience constructor of MTOMAwareResultStreamWriter is of the form
* MTOMAwareResultStreamWriter(nameOfResult, outputStream)
* where
* @param nameOfResult is the name used for the root (parent) tag by the serialization bean
* @param outputStream is the (servlet) output stream into which the bytes are written
* Addtionally, as a side effect, ensure that the org.apache.axis2.databinding classes which serialize the
* output of each fields have been initialized to be aware of any custom classes which override the default
* output xsd converter methods of Axis2's databinding. Such a custom class is notified to the ADB framework
* (via its org.apache.axis2.databinding.utils.ConverterUtil class) by setting a System property,
* SYSTEM_PROPERTY_ADB_CONVERTERUTIL to name the custom class.
*/
public class MTOMAwareResultStreamWriter {
// Standard XML prolog to add to the beginning of each XML document.
public static final String XMLPROLOG = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
private static final byte[] XMLPROLOGBYTES = XMLPROLOG.getBytes();
// The XML namespace used in documents transported to and from the service
public static final String S3XMLNS = "http://s3.amazonaws.com/doc/2006-03-01/";
// Prefix to use to represent the default XML Namespace, defined by the Namespaces in XML 3 spec to be ""
public static final String DEFAULT_NS_PREFIX = XMLConstants.DEFAULT_NS_PREFIX;
private XMLStreamWriter xmlWriter = null;
private MTOMAwareXMLSerializer mtomWriter = null;
// A default instance of AXIOM object model factory suitable for constructing plain XML
private OMFactory omfactory = OMAbstractFactory.getOMFactory();
// The qualified name for use in the XML schema as defined by http://www.w3.org/TR/xmlschema-2/#QName
private QName qualifiedName = null;
// Usually bound to a servlet output stream
private OutputStream outputStream = null;
// Set the system property to notify the ADB framework of its custom class for system-wide side effect
// at time of initialization of this class (executed once in any JVM running this application)
static {
System.setProperty(org.apache.axis2.databinding.utils.ConverterUtil.SYSTEM_PROPERTY_ADB_CONVERTERUTIL, "com.cloud.bridge.util.DatabindingConverterUtil");
}
/*
* @params
* @param nameOfResult Used as the tag description of the result written out when the requester serializes
* @param outputStream The stream capable of sinking bytes written at the time the requester is ready to serialize,
* assumed to be a ServletOutputStream
* @param xmlOutputFactory If passing a non-default factory, used to get an implementor of XmlStreamWriter
* @throw XMLStreamException
*/
public MTOMAwareResultStreamWriter(String nameOfResult, OutputStream outputStream, XMLOutputFactory xmlOutputFactory) throws XMLStreamException {
this.outputStream = outputStream;
// Create an implementor of xmlWriter for this instance
xmlWriter = xmlOutputFactory.createXMLStreamWriter(outputStream);
// Create an MTOM aware XML serializer for this instance
// An MTOMAwareXMLSerializer wraps a xmlStreamWriter and implements writeDataHandler
mtomWriter = new MTOMAwareXMLSerializer(xmlWriter);
// Create a new qualified name passing in namespace URI (default), localpart, prefix (default)
qualifiedName = new QName(S3XMLNS, nameOfResult, DEFAULT_NS_PREFIX);
}
/*
* @params
* @param nameOfResult Used as the tag description of the result written out when the requester serializes
* @param outputStream The stream capable of sinking bytes written at the time the requester is ready to serialize,
* assumed to be a ServletOutputStream
* Uses default implementor of XmlStreamWriter
* @throw XMLStreamException
*/
public MTOMAwareResultStreamWriter(String nameOfResult, OutputStream outputStream) throws XMLStreamException {
this(nameOfResult, outputStream, XMLOutputFactory.newInstance());
}
// Housekeeping before consumption in a serialize call
public void startWrite() throws IOException {
outputStream.write(XMLPROLOGBYTES);
}
public void stopWrite() throws IOException, XMLStreamException {
xmlWriter.flush();
xmlWriter.close();
outputStream.close();
}
// Cooperate with an instance of org.apache.axis2.databinding.ADBBean to provide serialization output of XML
// An org.apache.axis2.databinding.ADBBean implements a serialize method which takes a QName and a XMLStreamWriter
public void writeout(ADBBean dataBindingBean) throws ADBException, XMLStreamException {
dataBindingBean.serialize(qualifiedName, omfactory, mtomWriter);
}
}