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

net.sf.saxon.lib.StandardMessageHandler Maven / Gradle / Ivy

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2018-2023 Saxonica Limited
// 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/.
// This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package net.sf.saxon.lib;

import net.sf.saxon.Configuration;
import net.sf.saxon.event.Receiver;
import net.sf.saxon.s9api.Message;
import net.sf.saxon.s9api.XdmNode;
import net.sf.saxon.s9api.XdmNodeKind;
import net.sf.saxon.serialize.SerializationProperties;
import net.sf.saxon.serialize.UnicodeWriterResult;
import net.sf.saxon.str.UnicodeWriter;
import net.sf.saxon.str.UnicodeWriterToWriter;
import net.sf.saxon.trans.XPathException;

import javax.xml.transform.OutputKeys;
import java.io.Writer;
import java.util.Properties;
import java.util.function.Consumer;

/**
 * This is the default implementation of the new Saxon 11 interface
 * for user-defined handling of {@code xsl:message} and {@code xsl:assert}
 * output.
 */

public class StandardMessageHandler implements Consumer {

    private final Configuration config;
    private UnicodeWriter writer;
    private final SerializationProperties serializationProperties;

    public StandardMessageHandler(Configuration config) {
        this.config = config;
        serializationProperties = getSerializationProperties();
    }

    /**
     * Get the serialization properties to be used. This is a public method so that
     * it can be overridden in a user-written subclass.
     * @return the serialization properties. By default the properties returned
     * are method="yes", indent="yes", omit-xml-declaration="yes".
     */

    public SerializationProperties getSerializationProperties() {
        Properties props = new Properties();
        props.setProperty(OutputKeys.METHOD, "xml");
        props.setProperty(OutputKeys.INDENT, "yes");
        props.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        return new SerializationProperties(props);
    }

    /**
     * Set the destination to which serialized messages will be written
     * @param writer the destination for serialized messages
     */

    public void setUnicodeWriter(UnicodeWriter writer) {
        this.writer = writer;
    }

    /**
     * Get the destination to which serialized messages will be written
     * @return the destination for serialized messages
     */

    public UnicodeWriter getUnicodeWriter() {
        return this.writer;
    }

    public synchronized void accept(Message message) {
        try {
            XdmNode node = message.getContent();
            assert node.getNodeKind() == XdmNodeKind.DOCUMENT;
            if (writer == null) {
                Writer w = config.getLogger().asWriter();
                writer = new UnicodeWriterToWriter(w);
            }
            UnicodeWriterResult result = new UnicodeWriterResult(writer, null);
            Receiver out = config.getSerializerFactory().getReceiver(result, serializationProperties);
            out.open();
            out.append(node.getUnderlyingNode());
            out.close();
        } catch (XPathException e) {
            // No action if xsl:message fails
        }
    }
}






© 2015 - 2025 Weber Informatics LLC | Privacy Policy