/** * Executes a query. * * @param query query to be executed * @return list of serialized result items * @throws IOException error during query execution */ private StringList execute(final WebDAVQuery query) throws IOException { final ClassLoader cl = getClass().getClassLoader(); final InputStream s = cl.getResourceAsStream(FILE); if (s == null) throw new IOException("WebDAV module not found"); final byte[] module = new IOStream(s).read(); final QueryProcessor qp = new QueryProcessor(query.toString(), http.context()); try { for (final Entry<String, Object> entry : query.entries()) { qp.bind(entry.getKey(), entry.getValue()); } qp.ctx.parseLibrary(string(module), FILE, qp.sc); final Result r = qp.execute(); final int n = (int) r.size(); final StringList items = new StringList(n); for (int i = 0; i < n; i++) { final ArrayOutput ao = new ArrayOutput(); r.serialize(Serializer.get(ao), 0); items.add(ao.toString()); } return items; } catch (final QueryException ex) { throw new BaseXException(ex); } catch (final Exception ex) { Util.debug(ex); throw new BaseXException(ex); } finally { qp.close(); } }
/** * Creates a new lock for the specified resource. * * @param db database * @param p path * @param scope lock scope * @param type lock type * @param depth lock depth * @param user lock user * @param to lock timeout * @return lock token * @throws IOException I/O exception */ public String lock( final String db, final String p, final String scope, final String type, final String depth, final String user, final Long to) throws IOException { initLockDb(); final String token = UUID.randomUUID().toString(); final WebDAVQuery query = new WebDAVQuery( "w:create-lock(" + "$path, $token, $scope, $type, $depth, $owner,$timeout)"); query.bind("path", db + SEP + p); query.bind("token", token); query.bind("scope", scope); query.bind("type", type); query.bind("depth", depth); query.bind("owner", user); query.bind("timeout", to == null ? Long.MAX_VALUE : to); execute(query); return token; }