use of org.exist.xquery.CompiledXQuery in project exist by eXist-db.
the class IPRangeRealm method authenticate.
@Override
public Subject authenticate(final String ipAddress, final Object credentials) throws AuthenticationException {
// Elevaste to system privileges
try (final DBBroker broker = getSecurityManager().database().get(Optional.of(getSecurityManager().getSystemSubject()))) {
// Convert IP address
final long ipToTest = ipToLong(InetAddress.getByName(ipAddress));
// Get xquery service
final XQuery queryService = broker.getBrokerPool().getXQueryService();
if (queryService == null) {
LOG.error("IPRange broker unable to retrieve XQueryService");
return null;
}
// Construct XQuery
final String query = "collection('/db/system/security/iprange/accounts')/account/" + "iprange[" + ipToTest + " ge number(start) and " + ipToTest + " le number(end)]/../name";
final XQueryContext context = new XQueryContext(broker.getBrokerPool());
final CompiledXQuery compiled = queryService.compile(context, query);
final Properties outputProperties = new Properties();
// Execute xQuery
final Sequence result = queryService.execute(broker, compiled, null, outputProperties);
final SequenceIterator i = result.iterate();
// Get FIRST username when present
final String username = i.hasNext() ? i.nextItem().getStringValue() : "";
if (i.hasNext()) {
LOG.warn("IP address {} matched multiple ipranges. Using first result only.", ipAddress);
}
if (!username.isEmpty()) {
final Account account = getSecurityManager().getAccount(username);
if (account != null) {
LOG.info("IPRangeRealm trying {}", account.getName());
return new SubjectAccreditedImpl((AbstractAccount) account, ipAddress);
} else {
LOG.info("IPRangeRealm couldn't resolve account for {}", username);
}
} else {
LOG.info("IPRangeRealm xquery found no matches");
}
return null;
} catch (final EXistException | UnknownHostException | XPathException | PermissionDeniedException e) {
throw new AuthenticationException(AuthenticationException.UNNOWN_EXCEPTION, e.getMessage());
}
}
use of org.exist.xquery.CompiledXQuery in project exist by eXist-db.
the class RedirectorServlet method executeQuery.
private Sequence executeQuery(final Source source, final RequestWrapper request, final ResponseWrapper response) throws EXistException, XPathException, PermissionDeniedException, IOException {
final XQuery xquery = getPool().getXQueryService();
final XQueryPool pool = getPool().getXQueryPool();
try (final DBBroker broker = getPool().getBroker()) {
final XQueryContext context;
CompiledXQuery compiled = pool.borrowCompiledXQuery(broker, source);
if (compiled == null) {
// special header to indicate that the query is not returned from
// cache
response.setHeader("X-XQuery-Cached", "false");
context = new XQueryContext(getPool());
context.setModuleLoadPath(XmldbURI.EMBEDDED_SERVER_URI.toString());
compiled = xquery.compile(context, source);
} else {
response.setHeader("X-XQuery-Cached", "true");
context = compiled.getContext();
context.prepareForReuse();
}
try {
return xquery.execute(broker, compiled, null, new Properties());
} finally {
context.runCleanupTasks();
pool.returnCompiledXQuery(source, compiled);
}
}
}
use of org.exist.xquery.CompiledXQuery in project exist by eXist-db.
the class SanityReport method ping.
@Override
public long ping(boolean checkQueryEngine) {
final long start = System.currentTimeMillis();
lastPingRespTime = -1;
lastActionInfo = "Ping";
taskstatus.setStatus(TaskStatus.Status.PING_WAIT);
// this will block forever.
try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getGuestSubject()))) {
if (checkQueryEngine) {
final XQuery xquery = pool.getXQueryService();
final XQueryPool xqPool = pool.getXQueryPool();
CompiledXQuery compiled = xqPool.borrowCompiledXQuery(broker, TEST_XQUERY);
if (compiled == null) {
final XQueryContext context = new XQueryContext(pool);
compiled = xquery.compile(context, TEST_XQUERY);
} else {
compiled.getContext().prepareForReuse();
}
try {
xquery.execute(broker, compiled, null);
} finally {
compiled.getContext().runCleanupTasks();
xqPool.returnCompiledXQuery(TEST_XQUERY, compiled);
}
}
} catch (final Exception e) {
lastPingRespTime = -2;
taskstatus.setStatus(TaskStatus.Status.PING_ERROR);
taskstatus.setStatusChangeTime();
taskstatus.setReason(e.getMessage());
changeStatus(taskstatus);
} finally {
lastPingRespTime = System.currentTimeMillis() - start;
taskstatus.setStatus(TaskStatus.Status.PING_OK);
taskstatus.setStatusChangeTime();
taskstatus.setReason("ping response time: " + lastPingRespTime);
changeStatus(taskstatus);
}
return lastPingRespTime;
}
use of org.exist.xquery.CompiledXQuery in project exist by eXist-db.
the class AbstractTestRunner method executeQuery.
protected static Sequence executeQuery(final BrokerPool brokerPool, final Source query, final List<Function<XQueryContext, Tuple2<String, Object>>> externalVariableBindings) throws EXistException, PermissionDeniedException, XPathException, IOException, DatabaseConfigurationException {
final SecurityManager securityManager = requireNonNull(brokerPool.getSecurityManager(), "securityManager is null");
try (final DBBroker broker = brokerPool.get(Optional.of(securityManager.getSystemSubject()))) {
final XQueryPool queryPool = brokerPool.getXQueryPool();
CompiledXQuery compiledQuery = queryPool.borrowCompiledXQuery(broker, query);
try {
XQueryContext context;
if (compiledQuery == null) {
context = new XQueryContext(broker.getBrokerPool());
} else {
context = compiledQuery.getContext();
context.prepareForReuse();
}
// setup misc. context
context.setBaseURI(new AnyURIValue("/db"));
if (query instanceof FileSource) {
final Path queryPath = Paths.get(((FileSource) query).getPath().toAbsolutePath().toString());
if (Files.isDirectory(queryPath)) {
context.setModuleLoadPath(queryPath.toString());
} else {
context.setModuleLoadPath(queryPath.getParent().toString());
}
}
// declare variables for the query
for (final Function<XQueryContext, Tuple2<String, Object>> externalVariableBinding : externalVariableBindings) {
final Tuple2<String, Object> nameValue = externalVariableBinding.apply(context);
context.declareVariable(nameValue._1, nameValue._2);
}
final XQuery xqueryService = brokerPool.getXQueryService();
// compile or update the context
if (compiledQuery == null) {
compiledQuery = xqueryService.compile(context, query);
} else {
compiledQuery.getContext().updateContext(context);
context.getWatchDog().reset();
}
return xqueryService.execute(broker, compiledQuery, null);
} finally {
queryPool.returnCompiledXQuery(query, compiledQuery);
}
}
}
use of org.exist.xquery.CompiledXQuery in project exist by eXist-db.
the class DebuggeeJointImpl method evalution.
@Override
public String evalution(String script) throws Exception {
Database db = compiledXQuery.getContext().getDatabase();
// TODO: account required
try (final DBBroker broker = db.getBroker()) {
XQueryContext context = compiledXQuery.getContext().copyContext();
context.setDebuggeeJoint(null);
context.undeclareGlobalVariable(Debuggee.SESSION);
context.undeclareGlobalVariable(Debuggee.IDEKEY);
XQuery service = broker.getBrokerPool().getXQueryService();
CompiledXQuery compiled = service.compile(broker, context, script);
Sequence resultSequence = service.execute(broker, compiled, null);
SAXSerializer sax = null;
Serializer serializer = broker.getSerializer();
serializer.reset();
try {
sax = (SAXSerializer) SerializerPool.getInstance().borrowObject(SAXSerializer.class);
Properties outputProps = new Properties();
StringWriter writer = new StringWriter();
sax.setOutput(writer, outputProps);
serializer.setSAXHandlers(sax, sax);
for (SequenceIterator i = resultSequence.iterate(); i.hasNext(); ) {
Item next = i.nextItem();
if (Type.subTypeOf(next.getType(), Type.NODE))
serializer.toSAX((NodeValue) next);
else
writer.write(next.getStringValue());
}
return writer.toString();
} finally {
if (sax != null) {
SerializerPool.getInstance().returnObject(sax);
}
}
}
}
Aggregations