package org.basex.core.cmd; import static org.basex.core.Text.*; import org.basex.server.ClientListener; import org.basex.server.Sessions; /** * Evaluates the 'kill' command and stops user sessions. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class Kill extends AUser { /** Number of modifications. */ private int count; /** * Default constructor. * @param user user to kill */ public Kill(final String user) { super(user); } @Override protected boolean run() { boolean ok = run(0, false); if(!ok || count == 0) { ok = true; error(""); // kill all sessions with the specified IP (and optional port) final Sessions ss = context.sessions; final String arg = args[0]; for(int s = ss.size() - 1; s >= 0; --s) { final ClientListener cl = ss.get(s); final String cs = cl.toString().replaceAll("\\[|\\]", ""); if(cl.context() == context) { // show error if own session is addressed if(cs.equals(arg)) return error(KILL_SELF_X, arg); } else if(cs.startsWith(arg)) { info(LI + cs); cl.quit(); count++; } } } return ok && info(SESSIONS_KILLED_X, count); } @Override protected boolean run(final String user, final String db) { // kill all sessions of the specified user final Sessions ss = context.sessions; for(int s = ss.size() - 1; s >= 0; --s) { final ClientListener cl = ss.get(s); // don't kill own sessions if(cl.context() != context && user.equals(cl.context().user.name)) { cl.quit(); count++; } } return true; } }