Search in sources :

Example 1 with XQDocHelper

use of org.exist.xqdoc.XQDocHelper in project exist by eXist-db.

the class Scan method eval.

@Override
public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException {
    Source source = null;
    String name;
    if (getArgumentCount() == 2) {
        byte[] data;
        try {
            data = binaryValueToByteArray((BinaryValue) args[0].itemAt(0));
        } catch (IOException ioe) {
            throw new XPathException(ioe.getMessage(), ioe);
        }
        name = args[1].getStringValue();
        source = new BinarySource(data, true);
    } else {
        String uri = args[0].getStringValue();
        if (uri.startsWith(XmldbURI.XMLDB_URI_PREFIX)) {
            try {
                XmldbURI resourceURI = XmldbURI.xmldbUriFor(uri);
                try (final Collection collection = context.getBroker().openCollection(resourceURI.removeLastSegment(), LockMode.READ_LOCK)) {
                    if (collection == null) {
                        LOG.warn("collection not found: {}", resourceURI.getCollectionPath());
                        return Sequence.EMPTY_SEQUENCE;
                    }
                    try (final LockedDocument lockedDoc = collection.getDocumentWithLock(context.getBroker(), resourceURI.lastSegment(), LockMode.READ_LOCK)) {
                        // NOTE: early release of Collection lock inline with Asymmetrical Locking scheme
                        collection.close();
                        final DocumentImpl doc = lockedDoc == null ? null : lockedDoc.getDocument();
                        if (doc == null) {
                            return Sequence.EMPTY_SEQUENCE;
                        }
                        if (doc.getResourceType() != DocumentImpl.BINARY_FILE || !doc.getMimeType().equals("application/xquery")) {
                            throw new XPathException(this, "XQuery resource: " + uri + " is not an XQuery or " + "declares a wrong mime-type");
                        }
                        source = new DBSource(context.getBroker(), (BinaryDocument) doc, false);
                        name = doc.getFileURI().toString();
                    }
                } catch (LockException e) {
                    throw new XPathException(this, "internal lock error: " + e.getMessage());
                } catch (PermissionDeniedException pde) {
                    throw new XPathException(this, pde.getMessage(), pde);
                }
            } catch (URISyntaxException e) {
                throw new XPathException(this, "invalid module uri: " + uri + ": " + e.getMessage(), e);
            }
        } else {
            // first check if the URI points to a registered module
            String location = context.getModuleLocation(uri);
            if (location != null)
                uri = location;
            try {
                source = SourceFactory.getSource(context.getBroker(), context.getModuleLoadPath(), uri, false);
                if (source == null) {
                    throw new XPathException(this, "failed to read module " + uri);
                }
                name = extractName(uri);
            } catch (IOException e) {
                throw new XPathException(this, "failed to read module " + uri, e);
            } catch (PermissionDeniedException e) {
                throw new XPathException(this, "permission denied to read module " + uri, e);
            }
        }
    }
    try {
        XQDocHelper helper = new XQDocHelper();
        String xml = helper.scan(source, name);
        NodeValue root = ModuleUtils.stringToXML(context, xml);
        if (root == null)
            return Sequence.EMPTY_SEQUENCE;
        return normalize((NodeValue) ((Document) root).getDocumentElement());
    } catch (XQDocException | SAXException e) {
        throw new XPathException(this, "error while scanning module: " + e.getMessage(), e);
    } catch (IOException e) {
        throw new XPathException(this, "IO error while scanning module: " + e.getMessage(), e);
    }
}
Also used : XQDocException(org.xqdoc.conversion.XQDocException) IOException(java.io.IOException) URISyntaxException(java.net.URISyntaxException) LockedDocument(org.exist.dom.persistent.LockedDocument) Document(org.w3c.dom.Document) BinaryDocument(org.exist.dom.persistent.BinaryDocument) DocumentImpl(org.exist.dom.persistent.DocumentImpl) SAXException(org.xml.sax.SAXException) BinaryDocument(org.exist.dom.persistent.BinaryDocument) LockException(org.exist.util.LockException) LockedDocument(org.exist.dom.persistent.LockedDocument) Collection(org.exist.collections.Collection) PermissionDeniedException(org.exist.security.PermissionDeniedException) XmldbURI(org.exist.xmldb.XmldbURI) XQDocHelper(org.exist.xqdoc.XQDocHelper)

Aggregations

IOException (java.io.IOException)1 URISyntaxException (java.net.URISyntaxException)1 Collection (org.exist.collections.Collection)1 BinaryDocument (org.exist.dom.persistent.BinaryDocument)1 DocumentImpl (org.exist.dom.persistent.DocumentImpl)1 LockedDocument (org.exist.dom.persistent.LockedDocument)1 PermissionDeniedException (org.exist.security.PermissionDeniedException)1 LockException (org.exist.util.LockException)1 XmldbURI (org.exist.xmldb.XmldbURI)1 XQDocHelper (org.exist.xqdoc.XQDocHelper)1 Document (org.w3c.dom.Document)1 SAXException (org.xml.sax.SAXException)1 XQDocException (org.xqdoc.conversion.XQDocException)1