package org.basex.http.restxq; import javax.servlet.http.*; import org.basex.http.*; import org.basex.query.*; import org.basex.util.*; /** * Information on a RESTXQ session. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ final class RestXqSession { /** HTTP session. */ private final HttpSession session; /** Id of singleton function ({@code null} if function is no singleton). */ private final String singleton; /** Query context. */ private final QueryContext qc; /** * Returns a query context stored in the current session. * @param conn HTTP connection * @param singleton id of singleton function * @param qc query context */ RestXqSession(final HTTPConnection conn, final String singleton, final QueryContext qc) { this.qc = qc; this.singleton = singleton; session = conn.req.getSession(); // singleton function: stop evaluation of existing function, wait until it has been finished if(singleton != null) { final Object oldQc = session.getAttribute(singleton); if(oldQc instanceof QueryContext) { ((QueryContext) oldQc).stop(); do { Performance.sleep(1); } while(session.getAttribute(singleton) == oldQc); } session.setAttribute(singleton, qc); } } /** * Closes a session. Drops a previously cached query context. */ void close() { if(singleton != null) { final Object oldQc = session.getAttribute(singleton); if(oldQc == qc) session.removeAttribute(singleton); } } }