All Downloads are FREE. Search and download functionalities are using the official Maven repository.

network.oxalis.vefa.peppol.sbdh.util.XMLBinaryOutputStream Maven / Gradle / Ivy

/*
 * Copyright 2015-2017 Direktoratet for forvaltning og IKT
 *
 * This source code is subject to dual licensing:
 *
 *
 * Licensed under the EUPL, Version 1.1 or – as soon they
 * will be approved by the European Commission - subsequent
 * versions of the EUPL (the "Licence");
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 *
 * See the Licence for the specific language governing
 * permissions and limitations under the Licence.
 */

package network.oxalis.vefa.peppol.sbdh.util;

import com.google.common.io.BaseEncoding;
import network.oxalis.vefa.peppol.sbdh.Ns;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;

public class XMLBinaryOutputStream extends OutputStream {

    private final BaseEncoding baseEncoding = BaseEncoding.base64().withSeparator("\n", 76);

    private final XMLStreamWriter xmlStreamWriter;

    private byte[] bytes = new byte[3 * 20];

    private int counter;

    public XMLBinaryOutputStream(XMLStreamWriter xmlStreamWriter, String mimeType, String encoding)
            throws XMLStreamException {
        this.xmlStreamWriter = xmlStreamWriter;

        xmlStreamWriter.writeStartElement("", Ns.QNAME_BINARY_CONTENT.getLocalPart(), Ns.EXTENSION);
        xmlStreamWriter.writeDefaultNamespace(Ns.EXTENSION);
        xmlStreamWriter.writeAttribute("mimeType", mimeType);

        if (encoding != null)
            xmlStreamWriter.writeAttribute("encoding", encoding);
    }

    @Override
    public void write(int b) throws IOException {
        bytes[counter++] = (byte) b;

        if (counter == bytes.length) {
            try {
                xmlStreamWriter.writeCharacters(baseEncoding.encode(bytes));
                counter = 0;
            } catch (XMLStreamException e) {
                throw new IOException(e.getMessage(), e);
            }
        }
    }

    @Override
    public void close() throws IOException {
        try {
            if (counter > 0)
                xmlStreamWriter.writeCharacters(baseEncoding.encode(Arrays.copyOf(bytes, counter)));

            xmlStreamWriter.writeEndElement();
        } catch (XMLStreamException e) {
            throw new IOException(e.getMessage(), e);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy