package org.basex.modules; import java.util.*; import javax.servlet.http.*; import org.basex.data.*; import org.basex.query.*; import org.basex.query.value.*; import org.basex.query.value.item.*; import org.basex.query.value.node.*; import org.basex.query.value.seq.*; import org.basex.util.*; import org.basex.util.list.*; /** * This module contains functions for processing global sessions. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ final class ASession { /** Query context. */ private final QueryContext qc; /** Session. */ private final HttpSession session; /** * Constructor. * @param session session * @param qc query context */ ASession(final HttpSession session, final QueryContext qc) { this.session = session; this.qc = qc; } /** * Returns the session ID. * @return session id */ Str id() { return Str.get(session.getId()); } /** * Returns the creation time. * @return creation time */ Dtm created() { return Dtm.get(session.getCreationTime()); } /** * Returns the last access time. * @return creation time */ Dtm accessed() { return Dtm.get(session.getLastAccessedTime()); } /** * Returns all session attributes. * @return session attributes */ Value names() { final TokenList tl = new TokenList(); final Enumeration<String> en = session.getAttributeNames(); while(en.hasMoreElements()) tl.add(en.nextElement()); return StrSeq.get(tl); } /** * Returns a session attribute. * @param key key to be requested * @return session attribute * @throws QueryException query exception */ Value get(final Str key) throws QueryException { return get(key, null); } /** * Returns a session attribute. * @param key key to be requested * @param def default value (can be {@code null}) * @return session attribute * @throws QueryException query exception */ Value get(final Str key, final Value def) throws QueryException { final Object o = session.getAttribute(key.toJava()); if(o == null) return def; if(o instanceof Value) return (Value) o; throw SessionErrors.noAttribute(Util.className(o)); } /** * Updates a session attribute. * @param key key of the attribute * @param value value to be stored * @throws QueryException query exception */ void set(final Str key, final Value value) throws QueryException { final ValueBuilder vb = new ValueBuilder(); for(final Item item : value) { if(item instanceof FItem) throw SessionErrors.functionItem(); final Data d = item.data(); vb.add(d == null || d.inMemory() ? item : ((ANode) item).deepCopy(qc.context.options)); } session.setAttribute(key.toJava(), vb.value()); } /** * Removes a session attribute. * @param key key of the attribute */ void delete(final Str key) { session.removeAttribute(key.toJava()); } /** * Closes a session. */ void close() { session.invalidate(); } }