/* * Copyright (c) 2006, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * Licensed 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.wso2.carbon.mediator.transform.stream; import java.io.IOException; import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.events.XMLEvent; import org.apache.axiom.om.OMElement; /** * This class populates XML events from the OMElement and write to an OutputStream. * The written events are returned as a byte array when requested. */ public class IOElementPipe { /** XML events are written to this OutputStrem. */ private ElementOutputStream outputStream; /** XMLEventReader created for OMElement. */ private XMLEventReader eventReader; /** Written event count for a one request. */ private final int MAX_EVENT_COUNT = 10; /** Writer used to write XML events. */ private XMLEventWriter xmlWriter; /** * Constructor which create IOElementPipe object with an OMElement object. * @param element OMElement object * @throws XMLStreamException * @throws FactoryConfigurationError */ public IOElementPipe(OMElement element) throws XMLStreamException, FactoryConfigurationError { XMLStreamReader xmlReader = element.getXMLStreamReaderWithoutCaching(); this.eventReader = XMLInputFactory.newInstance().createXMLEventReader(xmlReader); this.outputStream = new ElementOutputStream(); this.xmlWriter = XMLOutputFactory.newInstance().createXMLEventWriter(this.outputStream); } /** * Copy data from outputStream to a byte array. * @param count Number of bytes requested to read * @param off Stating point of byte array to copy data * @return byte array containing written events * @throws XMLStreamException * @throws FactoryConfigurationError */ public final byte[] getData(int count, final int off) throws XMLStreamException { populateEvents(); byte[] xmlEventsBuffer = this.outputStream.toByteArray(); if (xmlEventsBuffer.length < count) { count = xmlEventsBuffer.length; } byte[] copiedEventsBuffer = new byte[count]; System.arraycopy(xmlEventsBuffer, 0, copiedEventsBuffer, off, count); //InputStream read count length from outputStream buffer //resizeBuffer is called to remove count length from outputStream buffer this.outputStream.resizeBuffer(count); return copiedEventsBuffer; } /** * Read MAX_EVENT_COUNT events from eventReader and writes to outputStream. * @throws XMLStreamException * @throws FactoryConfigurationError */ private void populateEvents() throws XMLStreamException { int count = 0; XMLEvent event; while (this.eventReader.hasNext() && count < MAX_EVENT_COUNT) { event = (XMLEvent) this.eventReader.next(); this.xmlWriter.add(event); count++; } this.xmlWriter.flush(); } /** * Close the opened connections * @throws XMLStreamException * @throws IOException */ public void closeConnections() throws XMLStreamException, IOException { this.eventReader.close(); this.outputStream.close(); this.xmlWriter.close(); } }