Search in sources :

Example 31 with XPathException

use of org.exist.xquery.XPathException in project exist by eXist-db.

the class EXistResult method add.

@Override
public void add(final InputStream is) throws HttpClientException {
    try {
        // we have to make a temporary copy of the data stream, as the socket will be closed shortly
        final TemporaryFileManager temporaryFileManager = TemporaryFileManager.getInstance();
        final Path tempFile = temporaryFileManager.getTemporaryFile();
        Files.copy(is, tempFile, StandardCopyOption.REPLACE_EXISTING);
        result.add(BinaryValueFromFile.getInstance(context, new Base64BinaryValueType(), tempFile, (isClosed, file) -> temporaryFileManager.returnTemporaryFile(file)));
    } catch (final XPathException | IOException xpe) {
        throw new HttpClientException("Unable to add binary value to result:" + xpe.getMessage(), xpe);
    } finally {
        try {
            is.close();
        } catch (final IOException ioe) {
            logger.warn(ioe.getMessage(), ioe);
        }
    }
}
Also used : Path(java.nio.file.Path) TypeTest(org.exist.xquery.TypeTest) Files(java.nio.file.Files) TemporaryFileManager(org.exist.util.io.TemporaryFileManager) Result(org.expath.httpclient.model.Result) org.exist.xquery.value(org.exist.xquery.value) IOException(java.io.IOException) Reader(java.io.Reader) Source(javax.xml.transform.Source) StandardCopyOption(java.nio.file.StandardCopyOption) HttpResponse(org.expath.httpclient.HttpResponse) Logger(org.apache.logging.log4j.Logger) Charset(java.nio.charset.Charset) ModuleUtils(org.exist.xquery.modules.ModuleUtils) HttpClientException(org.expath.httpclient.HttpClientException) SAXException(org.xml.sax.SAXException) NodeTest(org.exist.xquery.NodeTest) DocumentImpl(org.exist.dom.memtree.DocumentImpl) Path(java.nio.file.Path) LogManager(org.apache.logging.log4j.LogManager) XPathException(org.exist.xquery.XPathException) XQueryContext(org.exist.xquery.XQueryContext) InputStream(java.io.InputStream) HttpClientException(org.expath.httpclient.HttpClientException) XPathException(org.exist.xquery.XPathException) IOException(java.io.IOException) TemporaryFileManager(org.exist.util.io.TemporaryFileManager)

Example 32 with XPathException

use of org.exist.xquery.XPathException in project exist by eXist-db.

the class EXistResult method add.

@Override
public void add(final HttpResponse response) throws HttpClientException {
    final EXistTreeBuilder builder = new EXistTreeBuilder(context);
    response.outputResponseElement(builder);
    final DocumentImpl doc = builder.close();
    try {
        // we add the root *element* to the result sequence
        final NodeTest kind = new TypeTest(Type.ELEMENT);
        // add the original items after
        if (result.isEmpty()) {
            doc.selectChildren(kind, result);
        } else {
            final ValueSequence newResult = new ValueSequence();
            doc.selectChildren(kind, newResult);
            newResult.addAll(result);
            result = newResult;
        }
    } catch (final XPathException xpe) {
        throw new HttpClientException("Unable to add HttpResponse to result:" + xpe.getMessage(), xpe);
    }
}
Also used : HttpClientException(org.expath.httpclient.HttpClientException) XPathException(org.exist.xquery.XPathException) TypeTest(org.exist.xquery.TypeTest) DocumentImpl(org.exist.dom.memtree.DocumentImpl) NodeTest(org.exist.xquery.NodeTest)

Example 33 with XPathException

use of org.exist.xquery.XPathException in project exist by eXist-db.

the class ExecuteFunction method eval.

@Override
public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException {
    if (args.length == 5 || args.length == 6) {
        // was a connection and PL/SQL statement specified?
        if (args[0].isEmpty() || args[1].isEmpty()) {
            return (Sequence.EMPTY_SEQUENCE);
        }
        // get the Connection
        long connectionUID = ((IntegerValue) args[0].itemAt(0)).getLong();
        Connection connection = SQLModule.retrieveConnection(context, connectionUID);
        if (connection == null) {
            return (Sequence.EMPTY_SEQUENCE);
        }
        // get the PL/SQL statement
        String plSql = args[1].getStringValue();
        // get the input parameters (if any)
        Element parameters = null;
        if (!args[2].isEmpty()) {
            parameters = (Element) args[2].itemAt(0);
        }
        // was a result set position specified?
        int resultSetPos = 0;
        if (!args[3].isEmpty()) {
            resultSetPos = ((IntegerValue) args[3].itemAt(0)).getInt();
        }
        boolean haveReturnCode = false;
        // default value of 1 for success
        int plSqlSuccess = 1;
        if (args.length == 6) {
            // a return code is expected so what is the value indicating success?
            plSqlSuccess = ((IntegerValue) args[5].itemAt(0)).getInt();
            haveReturnCode = true;
        }
        CallableStatement statement = null;
        ResultSet resultSet = null;
        try {
            MemTreeBuilder builder = context.getDocumentBuilder();
            int iRow = 0;
            statement = connection.prepareCall(plSql);
            if (haveReturnCode) {
                statement.registerOutParameter(1, Types.NUMERIC);
            }
            if (resultSetPos != 0) {
                statement.registerOutParameter(resultSetPos, OracleTypes.CURSOR);
            }
            if (!args[2].isEmpty()) {
                setParametersOnPreparedStatement(statement, parameters);
            }
            statement.execute();
            if (haveReturnCode) {
                int returnCode = statement.getInt(1);
                if (returnCode != plSqlSuccess) {
                    LOG.error(plSql + " failed [" + returnCode + "]");
                    return (Sequence.EMPTY_SEQUENCE);
                }
            }
            if (resultSetPos != 0) {
                // iterate through the result set building an XML document
                builder.startDocument();
                builder.startElement(new QName("result", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), null);
                builder.addAttribute(new QName("count", null, null), String.valueOf(-1));
                resultSet = (ResultSet) statement.getObject(resultSetPos);
                ResultSetMetaData rsmd = resultSet.getMetaData();
                int iColumns = rsmd.getColumnCount();
                while (resultSet.next()) {
                    builder.startElement(new QName("row", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), null);
                    builder.addAttribute(new QName("index", null, null), String.valueOf(resultSet.getRow()));
                    // get each tuple in the row
                    for (int i = 0; i < iColumns; i++) {
                        String columnName = rsmd.getColumnLabel(i + 1);
                        if (columnName != null) {
                            String colValue = resultSet.getString(i + 1);
                            String colElement = "field";
                            if (((BooleanValue) args[4].itemAt(0)).effectiveBooleanValue() && columnName.length() > 0) {
                                // use column names as the XML node
                                /**
                                 * Spaces in column names are replaced with
                                 * underscore's
                                 */
                                colElement = SQLUtils.escapeXmlAttr(columnName.replace(' ', '_'));
                            }
                            builder.startElement(new QName(colElement, OracleModule.NAMESPACE_URI, OracleModule.PREFIX), null);
                            if (!((BooleanValue) args[4].itemAt(0)).effectiveBooleanValue() || columnName.length() <= 0) {
                                String name;
                                if (columnName.length() > 0) {
                                    name = SQLUtils.escapeXmlAttr(columnName);
                                } else {
                                    name = "Column: " + String.valueOf(i + 1);
                                }
                                builder.addAttribute(new QName("name", null, null), name);
                            }
                            builder.addAttribute(new QName("type", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), rsmd.getColumnTypeName(i + 1));
                            builder.addAttribute(new QName("type", Namespaces.SCHEMA_NS, "xs"), Type.getTypeName(SQLUtils.sqlTypeToXMLType(rsmd.getColumnType(i + 1))));
                            if (resultSet.wasNull()) {
                                // Add a null indicator attribute if the value was SQL Null
                                builder.addAttribute(new QName("null", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), "true");
                            }
                            if (colValue != null) {
                                builder.characters(SQLUtils.escapeXmlText(colValue));
                            }
                            builder.endElement();
                        }
                    }
                    builder.endElement();
                    iRow++;
                }
                builder.endElement();
                // Change the root element count attribute to have the correct value
                NodeValue node = (NodeValue) builder.getDocument().getDocumentElement();
                Node count = node.getNode().getAttributes().getNamedItem("count");
                if (count != null) {
                    count.setNodeValue(String.valueOf(iRow));
                }
                builder.endDocument();
                // return the XML result set
                return (node);
            } else {
                // there was no result set so just return an empty sequence
                return (Sequence.EMPTY_SEQUENCE);
            }
        } catch (SQLException sqle) {
            LOG.error("oracle:execute() Caught SQLException \"" + sqle.getMessage() + "\" for PL/SQL: \"" + plSql + "\"", sqle);
            // return details about the SQLException
            MemTreeBuilder builder = context.getDocumentBuilder();
            builder.startDocument();
            builder.startElement(new QName("exception", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), null);
            boolean recoverable = false;
            if (sqle instanceof SQLRecoverableException) {
                recoverable = true;
            }
            builder.addAttribute(new QName("recoverable", null, null), String.valueOf(recoverable));
            builder.startElement(new QName("state", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), null);
            String sqlState = sqle.getSQLState();
            if (sqlState != null) {
                builder.characters(sqle.getSQLState());
            } else {
                builder.characters("null");
            }
            builder.endElement();
            builder.startElement(new QName("message", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), null);
            builder.characters(sqle.getMessage());
            builder.endElement();
            builder.startElement(new QName("stack-trace", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), null);
            ByteArrayOutputStream bufStackTrace = new ByteArrayOutputStream();
            sqle.printStackTrace(new PrintStream(bufStackTrace));
            builder.characters(new String(bufStackTrace.toByteArray()));
            builder.endElement();
            builder.startElement(new QName("oracle", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), null);
            builder.characters(SQLUtils.escapeXmlText(plSql));
            builder.endElement();
            int line = getLine();
            int column = getColumn();
            builder.startElement(new QName("xquery", OracleModule.NAMESPACE_URI, OracleModule.PREFIX), null);
            builder.addAttribute(new QName("line", null, null), String.valueOf(line));
            builder.addAttribute(new QName("column", null, null), String.valueOf(column));
            builder.endElement();
            builder.endElement();
            builder.endDocument();
            return (NodeValue) builder.getDocument().getDocumentElement();
        } finally {
            release(connection, statement, resultSet);
        }
    } else {
        throw new XPathException("Invalid number of arguments [" + args.length + "]");
    }
}
Also used : NodeValue(org.exist.xquery.value.NodeValue) PrintStream(java.io.PrintStream) SQLRecoverableException(java.sql.SQLRecoverableException) SQLException(java.sql.SQLException) XPathException(org.exist.xquery.XPathException) QName(org.exist.dom.QName) IntegerValue(org.exist.xquery.value.IntegerValue) Element(org.w3c.dom.Element) Node(org.w3c.dom.Node) Connection(java.sql.Connection) ByteArrayOutputStream(org.apache.commons.io.output.ByteArrayOutputStream) ResultSetMetaData(java.sql.ResultSetMetaData) MemTreeBuilder(org.exist.dom.memtree.MemTreeBuilder) CallableStatement(java.sql.CallableStatement) BooleanValue(org.exist.xquery.value.BooleanValue) ResultSet(java.sql.ResultSet)

Example 34 with XPathException

use of org.exist.xquery.XPathException in project exist by eXist-db.

the class MessageListFunctions method parseSubjectTerm.

private SearchTerm parseSubjectTerm(Node terms) throws XPathException {
    SearchTerm st = null;
    String pattern = ((Element) terms).getAttribute("pattern");
    if (pattern != null && !pattern.isEmpty()) {
        st = new SubjectTerm(pattern);
    } else {
        throw (new XPathException(this, "Pattern attribute must be specified for term with type: " + ((Element) terms).getAttribute("type")));
    }
    return (st);
}
Also used : XPathException(org.exist.xquery.XPathException) Element(org.w3c.dom.Element) SearchTerm(jakarta.mail.search.SearchTerm) SubjectTerm(jakarta.mail.search.SubjectTerm)

Example 35 with XPathException

use of org.exist.xquery.XPathException in project exist by eXist-db.

the class MessageListFunctions method getMessageList.

// ***************************************************************************
// *
// *    Function Implementation Methods
// *
// ***************************************************************************/
private Sequence getMessageList(Sequence[] args, Sequence contextSequence) throws XPathException {
    Message[] msgList;
    // was a folder handle specified?
    if (args[0].isEmpty()) {
        throw (new XPathException(this, "Folder handle not specified"));
    }
    // get the Folder
    long folderHandle = ((IntegerValue) args[0].itemAt(0)).getLong();
    Folder folder = MailModule.retrieveFolder(context, folderHandle);
    if (folder == null) {
        throw (new XPathException(this, "Invalid Folder handle specified"));
    }
    try {
        msgList = folder.getMessages();
        prefetchMessages(folder, msgList);
    } catch (MessagingException me) {
        throw (new XPathException(this, "Failed to get mail list", me));
    }
    return (new IntegerValue(MailModule.storeMessageList(context, msgList, folderHandle)));
}
Also used : Message(jakarta.mail.Message) XPathException(org.exist.xquery.XPathException) MessagingException(jakarta.mail.MessagingException) IntegerValue(org.exist.xquery.value.IntegerValue) Folder(jakarta.mail.Folder)

Aggregations

XPathException (org.exist.xquery.XPathException)306 Sequence (org.exist.xquery.value.Sequence)86 IOException (java.io.IOException)61 SAXException (org.xml.sax.SAXException)43 StringValue (org.exist.xquery.value.StringValue)40 PermissionDeniedException (org.exist.security.PermissionDeniedException)34 NodeValue (org.exist.xquery.value.NodeValue)34 DBBroker (org.exist.storage.DBBroker)32 IntegerValue (org.exist.xquery.value.IntegerValue)32 ValueSequence (org.exist.xquery.value.ValueSequence)27 Item (org.exist.xquery.value.Item)26 MemTreeBuilder (org.exist.dom.memtree.MemTreeBuilder)24 EXistException (org.exist.EXistException)23 Path (java.nio.file.Path)22 XmldbURI (org.exist.xmldb.XmldbURI)22 BrokerPool (org.exist.storage.BrokerPool)21 Txn (org.exist.storage.txn.Txn)21 XQueryContext (org.exist.xquery.XQueryContext)21 Element (org.w3c.dom.Element)21 XQuery (org.exist.xquery.XQuery)20