public void getEntryById(DBBroker broker, String path, String id, OutgoingMessage response) throws EXistException, BadRequestException { XQuery xquery = broker.getXQueryService(); CompiledXQuery feedQuery = xquery.getXQueryPool().borrowCompiledXQuery(broker, entryByIdSource); XQueryContext context; if (feedQuery == null) { context = xquery.newContext(AccessContext.REST); try { feedQuery = xquery.compile(context, entryByIdSource); } catch (XPathException ex) { throw new EXistException("Cannot compile xquery " + entryByIdSource.getURL(), ex); } catch (IOException ex) { throw new EXistException( "I/O exception while compiling xquery " + entryByIdSource.getURL(), ex); } } else { context = feedQuery.getContext(); } context.setStaticallyKnownDocuments( new XmldbURI[] {XmldbURI.create(path).append(AtomProtocol.FEED_DOCUMENT_NAME)}); try { context.declareVariable("id", id); Sequence resultSequence = xquery.execute(feedQuery, null); if (resultSequence.isEmpty()) { throw new BadRequestException("No topic was found."); } String charset = getContext().getDefaultCharset(); response.setContentType("application/atom+xml; charset=" + charset); Serializer serializer = broker.getSerializer(); serializer.reset(); try { Writer w = new OutputStreamWriter(response.getOutputStream(), charset); SAXSerializer sax = (SAXSerializer) SerializerPool.getInstance().borrowObject(SAXSerializer.class); Properties outputProperties = new Properties(); sax.setOutput(w, outputProperties); serializer.setProperties(outputProperties); serializer.setSAXHandlers(sax, sax); serializer.toSAX(resultSequence, 1, 1, false); SerializerPool.getInstance().returnObject(sax); w.flush(); w.close(); } catch (IOException ex) { LOG.fatal("Cannot read resource " + path, ex); throw new EXistException("I/O error on read of resource " + path, ex); } catch (SAXException saxe) { LOG.warn(saxe); throw new BadRequestException("Error while serializing XML: " + saxe.getMessage()); } resultSequence.itemAt(0); } catch (XPathException ex) { throw new EXistException("Cannot execute xquery " + entryByIdSource.getURL(), ex); } finally { xquery.getXQueryPool().returnCompiledXQuery(entryByIdSource, feedQuery); } }
private void buildXQueryDynamicContext( XQueryContext context, Object[] params, MutableDocumentSet docsToLock, boolean bindVariables) throws XPathException { context.setBackwardsCompatibility(false); context.setStaticallyKnownDocuments(docs); context.setBaseURI(baseUri == null ? new AnyURIValue("/db") : baseUri); if (bindVariables) { for (Map.Entry<QName, Object> entry : bindings.entrySet()) { context.declareVariable( new org.exist.dom.QName( entry.getKey().getLocalPart(), entry.getKey().getNamespaceURI(), entry.getKey().getPrefix()), convertValue(entry.getValue())); } if (params != null) for (int i = 0; i < params.length; i++) { Object convertedValue = convertValue(params[i]); if (docsToLock != null && convertedValue instanceof Sequence) { docsToLock.addAll(((Sequence) convertedValue).getDocumentSet()); } context.declareVariable("_" + (i + 1), convertedValue); } } }
private Sequence processQuery(String select) throws SAXException { XQueryContext context = null; try { context = new XQueryContext(broker.getBrokerPool(), accessCtx); context.setStaticallyKnownDocuments(documentSet); Map.Entry<String, String> namespaceEntry; for (final Iterator<Map.Entry<String, String>> i = namespaces.entrySet().iterator(); i.hasNext(); ) { namespaceEntry = (Map.Entry<String, String>) i.next(); context.declareNamespace(namespaceEntry.getKey(), namespaceEntry.getValue()); } Map.Entry<String, Object> entry; for (final Iterator<Map.Entry<String, Object>> i = variables.entrySet().iterator(); i.hasNext(); ) { entry = (Map.Entry<String, Object>) i.next(); context.declareVariable(entry.getKey().toString(), entry.getValue()); } // TODO(pkaminsk2): why replicate XQuery.compile here? final XQueryLexer lexer = new XQueryLexer(context, new StringReader(select)); final XQueryParser parser = new XQueryParser(lexer); final XQueryTreeParser treeParser = new XQueryTreeParser(context); parser.xpath(); if (parser.foundErrors()) { throw new SAXException(parser.getErrorMessage()); } final AST ast = parser.getAST(); if (LOG.isDebugEnabled()) { LOG.debug("generated AST: " + ast.toStringTree()); } final PathExpr expr = new PathExpr(context); treeParser.xpath(ast, expr); if (treeParser.foundErrors()) { throw new SAXException(treeParser.getErrorMessage()); } expr.analyze(new AnalyzeContextInfo()); final Sequence seq = expr.eval(null, null); return seq; } catch (final RecognitionException e) { LOG.warn("error while creating variable", e); throw new SAXException(e); } catch (final TokenStreamException e) { LOG.warn("error while creating variable", e); throw new SAXException(e); } catch (final XPathException e) { throw new SAXException(e); } finally { if (context != null) { context.reset(false); } } }