package org.basex.core.cmd;
import static org.basex.core.Text.*;
import java.io.IOException;
import org.basex.core.CommandBuilder;
import org.basex.core.Commands.Cmd;
import org.basex.core.Commands.CmdDrop;
import org.basex.data.Data;
import org.basex.server.ClientListener;
import org.basex.util.Util;
/**
* Evaluates the 'drop user' command and drops a user.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class DropUser extends AUser {
/**
* Default constructor.
* @param name name of user
*/
public DropUser(final String name) {
this(name, null);
}
/**
* Default constructor.
* @param name name of user
* @param db database
*/
public DropUser(final String name, final String db) {
super(name, db);
}
@Override
protected boolean run() {
return run(0, true);
}
@Override
protected boolean run(final String user, final String db) {
// admin cannot be dropped
if(user.equals(ADMIN)) return !info(ADMIN_STATIC_X);
// drop global user
if(db == null) {
for(final ClientListener s : context.sessions) {
if(s.context().user.name.equals(user))
return !info(USER_LOGGED_IN_X, user);
}
context.users.drop(context.users.get(user));
return info(USER_DROPPED_X, user);
}
// drop local user
try {
final Data data = Open.open(db, context);
if(data.meta.users.drop(data.meta.users.get(user))) {
info(USER_DROPPED_X_X, user, db);
data.meta.dirty = true;
data.flush();
}
Close.close(data, context);
return true;
} catch(final IOException ex) {
Util.debug(ex);
final String msg = ex.getMessage();
return !info(msg.isEmpty() ? DB_NOT_OPENED_X : msg, db);
}
}
@Override
public void build(final CommandBuilder cb) {
cb.init(Cmd.DROP + " " + CmdDrop.USER).arg(0).arg(ON, 1);
}
}