Search in sources :

Example 6 with Receiver

use of org.exist.util.serializer.Receiver in project exist by eXist-db.

the class Serializer method setupMatchListeners.

protected Receiver setupMatchListeners(NodeProxy p) {
    final Receiver oldReceiver = receiver;
    if (getHighlightingMode() != TAG_NONE) {
        final IndexController controller = broker.getIndexController();
        MatchListener listener = controller.getMatchListener(p);
        if (listener != null) {
            final MatchListener last = (MatchListener) listener.getLastInChain();
            last.setNextInChain(receiver);
            receiver = listener;
        }
    }
    return oldReceiver;
}
Also used : IndexController(org.exist.indexing.IndexController) Receiver(org.exist.util.serializer.Receiver) MatchListener(org.exist.indexing.MatchListener)

Example 7 with Receiver

use of org.exist.util.serializer.Receiver in project exist by eXist-db.

the class Serializer method setXSLHandler.

protected void setXSLHandler(NodeProxy root, boolean applyFilters) {
    if (templates != null && xslHandler != null) {
        final SAXResult result = new SAXResult();
        boolean processXInclude = "yes".equals(getProperty(EXistOutputKeys.EXPAND_XINCLUDES, "yes"));
        final ReceiverToSAX filter;
        if (processXInclude) {
            final Receiver xincludeReceiver = xinclude.getReceiver();
            if (xincludeReceiver != null && xincludeReceiver instanceof SAXSerializer) {
                filter = new ReceiverToSAX((SAXSerializer) xincludeReceiver);
            } else {
                filter = (ReceiverToSAX) xincludeReceiver;
            }
        } else {
            filter = (ReceiverToSAX) receiver;
        }
        result.setHandler(filter.getContentHandler());
        result.setLexicalHandler(filter.getLexicalHandler());
        filter.setLexicalHandler(xslHandler);
        filter.setContentHandler(xslHandler);
        xslHandler.setResult(result);
        if (processXInclude) {
            xinclude.setReceiver(new ReceiverToSAX(xslHandler));
            receiver = xinclude;
        } else {
            receiver = new ReceiverToSAX(xslHandler);
        }
    }
    if (root != null && getHighlightingMode() != TAG_NONE) {
        final IndexController controller = broker.getIndexController();
        MatchListener listener = controller.getMatchListener(root);
        if (listener != null) {
            final MatchListener last = (MatchListener) listener.getLastInChain();
            last.setNextInChain(receiver);
            receiver = listener;
        }
    }
    if (applyFilters && root == null && customMatchListeners.getFirst() != null) {
        customMatchListeners.getLast().setNextInChain(receiver);
        receiver = customMatchListeners.getFirst();
    }
}
Also used : SAXResult(javax.xml.transform.sax.SAXResult) ReceiverToSAX(org.exist.util.serializer.ReceiverToSAX) IndexController(org.exist.indexing.IndexController) Receiver(org.exist.util.serializer.Receiver) SAXSerializer(org.exist.util.serializer.SAXSerializer) MatchListener(org.exist.indexing.MatchListener)

Example 8 with Receiver

use of org.exist.util.serializer.Receiver in project exist by eXist-db.

the class AbstractChainOfReceivers method getLastInChain.

@Override
public Receiver getLastInChain() {
    Receiver last = this;
    Receiver next = getNextInChain();
    while (next != null) {
        last = next;
        next = ((ChainOfReceivers) next).getNextInChain();
    }
    return last;
}
Also used : Receiver(org.exist.util.serializer.Receiver)

Example 9 with Receiver

use of org.exist.util.serializer.Receiver in project exist by eXist-db.

the class Transform method eval.

/* (non-Javadoc)
     * @see org.exist.xquery.BasicFunction#eval(org.exist.xquery.value.Sequence[], org.exist.xquery.value.Sequence)
     */
public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException {
    final Properties attributes = new Properties();
    final Properties serializationProps = new Properties();
    final Properties stylesheetParams = new Properties();
    // Parameter 1 & 2
    final Sequence inputNode = args[0];
    final Item stylesheetItem = args[1].itemAt(0);
    // Parse 3rd parameter
    final Node options = args[2].isEmpty() ? null : ((NodeValue) args[2].itemAt(0)).getNode();
    if (options != null) {
        stylesheetParams.putAll(parseParameters(options));
    }
    // Parameter 4 when present
    if (getArgumentCount() >= 4) {
        final Sequence attrs = args[3];
        attributes.putAll(extractAttributes(attrs));
    }
    // Parameter 5 when present
    if (getArgumentCount() >= 5) {
        // extract serialization options
        final Sequence serOpts = args[4];
        serializationProps.putAll(extractSerializationProperties(serOpts));
    } else {
        context.checkOptions(serializationProps);
    }
    boolean expandXIncludes = "yes".equals(serializationProps.getProperty(EXistOutputKeys.EXPAND_XINCLUDES, "yes"));
    final XSLTErrorsListener<XPathException> errorListener = new XSLTErrorsListener<XPathException>(stopOnError, stopOnWarn) {

        @Override
        protected void raiseError(String error, Exception ex) throws XPathException {
            throw new XPathException(Transform.this, error, ex);
        }
    };
    // Setup handler and error listener
    final TransformerHandler handler = createHandler(stylesheetItem, stylesheetParams, attributes, errorListener);
    if (isCalledAs("transform")) {
        // transform:transform()
        final ValueSequence seq = new ValueSequence();
        context.pushDocumentContext();
        try {
            final MemTreeBuilder builder = context.getDocumentBuilder();
            final DocumentBuilderReceiver builderReceiver = new DocumentBuilderReceiver(builder, true);
            final SAXResult result = new SAXResult(builderReceiver);
            // preserve comments etc... from xslt output
            result.setLexicalHandler(builderReceiver);
            handler.setResult(result);
            final Receiver receiver = new ReceiverToSAX(handler);
            final Serializer serializer = context.getBroker().borrowSerializer();
            try {
                serializer.setProperties(serializationProps);
                serializer.setReceiver(receiver, true);
                if (expandXIncludes) {
                    String xiPath = serializationProps.getProperty(EXistOutputKeys.XINCLUDE_PATH);
                    if (xiPath != null && !xiPath.startsWith(XmldbURI.XMLDB_URI_PREFIX)) {
                        final Path f = Paths.get(xiPath).normalize();
                        if (!f.isAbsolute()) {
                            xiPath = Paths.get(context.getModuleLoadPath(), xiPath).normalize().toAbsolutePath().toString();
                        }
                    } else {
                        xiPath = context.getModuleLoadPath();
                    }
                    serializer.getXIncludeFilter().setModuleLoadPath(xiPath);
                }
                serializer.toSAX(inputNode, 1, inputNode.getItemCount(), false, false, 0, 0);
            } catch (final Exception e) {
                throw new XPathException(this, "Exception while transforming node: " + e.getMessage(), e);
            } finally {
                context.getBroker().returnSerializer(serializer);
            }
            errorListener.checkForErrors();
            Node next = builder.getDocument().getFirstChild();
            while (next != null) {
                seq.add((NodeValue) next);
                next = next.getNextSibling();
            }
            return seq;
        } finally {
            context.popDocumentContext();
        }
    } else {
        // transform:stream-transform()
        final Optional<ResponseWrapper> maybeResponse = Optional.ofNullable(context.getHttpContext()).map(XQueryContext.HttpContext::getResponse);
        if (!maybeResponse.isPresent()) {
            throw new XPathException(this, ErrorCodes.XPDY0002, "No response object found in the current XQuery context.");
        }
        final ResponseWrapper response = maybeResponse.get();
        if (!"org.exist.http.servlets.HttpResponseWrapper".equals(response.getClass().getName())) {
            throw new XPathException(this, ErrorCodes.XPDY0002, signatures[1] + " can only be used within the EXistServlet or XQueryServlet");
        }
        // setup the response correctly
        final String mediaType = handler.getTransformer().getOutputProperty("media-type");
        final String encoding = handler.getTransformer().getOutputProperty("encoding");
        if (mediaType != null) {
            if (encoding == null) {
                response.setContentType(mediaType);
            } else {
                response.setContentType(mediaType + "; charset=" + encoding);
            }
        }
        // do the transformation
        try {
            final OutputStream os = new BufferedOutputStream(response.getOutputStream());
            final StreamResult result = new StreamResult(os);
            handler.setResult(result);
            final Serializer serializer = context.getBroker().borrowSerializer();
            Receiver receiver = new ReceiverToSAX(handler);
            try {
                serializer.setProperties(serializationProps);
                if (expandXIncludes) {
                    XIncludeFilter xinclude = new XIncludeFilter(serializer, receiver);
                    String xiPath = serializationProps.getProperty(EXistOutputKeys.XINCLUDE_PATH);
                    if (xiPath != null) {
                        final Path f = Paths.get(xiPath).normalize();
                        if (!f.isAbsolute()) {
                            xiPath = Paths.get(context.getModuleLoadPath(), xiPath).normalize().toAbsolutePath().toString();
                        }
                    } else {
                        xiPath = context.getModuleLoadPath();
                    }
                    xinclude.setModuleLoadPath(xiPath);
                    receiver = xinclude;
                }
                serializer.setReceiver(receiver);
                serializer.toSAX(inputNode);
            } catch (final Exception e) {
                throw new XPathException(this, "Exception while transforming node: " + e.getMessage(), e);
            } finally {
                context.getBroker().returnSerializer(serializer);
            }
            errorListener.checkForErrors();
            os.close();
            // commit the response
            response.flushBuffer();
        } catch (final IOException e) {
            throw new XPathException(this, "IO exception while transforming node: " + e.getMessage(), e);
        }
        return Sequence.EMPTY_SEQUENCE;
    }
}
Also used : TransformerHandler(javax.xml.transform.sax.TransformerHandler) Node(org.w3c.dom.Node) BufferedOutputStream(java.io.BufferedOutputStream) OutputStream(java.io.OutputStream) ResponseWrapper(org.exist.http.servlets.ResponseWrapper) Properties(java.util.Properties) XIncludeFilter(org.exist.storage.serializers.XIncludeFilter) XSLTErrorsListener(org.exist.xslt.XSLTErrorsListener) BufferedOutputStream(java.io.BufferedOutputStream) Serializer(org.exist.storage.serializers.Serializer) Path(java.nio.file.Path) StreamResult(javax.xml.transform.stream.StreamResult) ReceiverToSAX(org.exist.util.serializer.ReceiverToSAX) DocumentBuilderReceiver(org.exist.dom.memtree.DocumentBuilderReceiver) Receiver(org.exist.util.serializer.Receiver) IOException(java.io.IOException) DocumentBuilderReceiver(org.exist.dom.memtree.DocumentBuilderReceiver) IOException(java.io.IOException) MemTreeBuilder(org.exist.dom.memtree.MemTreeBuilder) SAXResult(javax.xml.transform.sax.SAXResult)

Aggregations

Receiver (org.exist.util.serializer.Receiver)9 MatchListener (org.exist.indexing.MatchListener)3 ReceiverToSAX (org.exist.util.serializer.ReceiverToSAX)3 SAXException (org.xml.sax.SAXException)3 SAXResult (javax.xml.transform.sax.SAXResult)2 DocumentBuilderReceiver (org.exist.dom.memtree.DocumentBuilderReceiver)2 MemTreeBuilder (org.exist.dom.memtree.MemTreeBuilder)2 IndexController (org.exist.indexing.IndexController)2 PermissionDeniedException (org.exist.security.PermissionDeniedException)2 Serializer (org.exist.storage.serializers.Serializer)2 SAXSerializer (org.exist.util.serializer.SAXSerializer)2 XPathException (org.exist.xquery.XPathException)2 BufferedOutputStream (java.io.BufferedOutputStream)1 IOException (java.io.IOException)1 OutputStream (java.io.OutputStream)1 URI (java.net.URI)1 URISyntaxException (java.net.URISyntaxException)1 Path (java.nio.file.Path)1 Properties (java.util.Properties)1 XMLStreamException (javax.xml.stream.XMLStreamException)1