package org.basex.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.basex.core.BaseXException;
import org.basex.core.Command;
import org.basex.core.CommandParser;
import org.basex.core.Context;
import org.basex.core.User;
import org.basex.core.cmd.Add;
import org.basex.core.cmd.CreateDB;
import org.basex.core.cmd.Exit;
import org.basex.core.cmd.Replace;
import org.basex.core.cmd.Store;
import org.basex.query.QueryException;
import org.basex.util.Token;
import org.basex.util.Util;
/**
* This class offers methods to locally execute database commands.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class LocalSession extends Session {
/** Database context. */
private final Context ctx;
/**
* Default constructor.
* @param context context
*/
public LocalSession(final Context context) {
this(context, null);
}
/**
* Constructor, specifying login data.
* @param context context
* @param user user name
* @param pass password
* @throws LoginException login exception
*/
public LocalSession(final Context context, final String user,
final String pass) throws LoginException {
this(context, user, pass, null);
}
/**
* Constructor, specifying login data and an output stream.
* @param context context
* @param user user name
* @param pass password
* @param output output stream
* @throws LoginException login exception
*/
public LocalSession(final Context context, final String user,
final String pass, final OutputStream output) throws LoginException {
this(context, output);
final User usr = ctx.users.get(user);
if(usr == null || !Token.eq(usr.password, Token.token(Token.md5(pass))))
throw new LoginException();
}
/**
* Constructor, specifying an output stream.
* @param context context
* @param output output stream
*/
public LocalSession(final Context context, final OutputStream output) {
super(output);
ctx = new Context(context, null);
ctx.user = context.user;
}
@Override
public void create(final String name, final InputStream input)
throws IOException {
execute(new CreateDB(name), input);
}
@Override
public void add(final String path, final InputStream input)
throws IOException {
execute(new Add(path), input);
}
@Override
public void replace(final String path, final InputStream input)
throws IOException {
execute(new Replace(path), input);
}
@Override
public void store(final String path, final InputStream input)
throws IOException {
execute(new Store(path), input);
}
/**
* Executes a command, passing the specified input.
* @param cmd command
* @param input input stream
* @throws BaseXException database exception
*/
private void execute(final Command cmd, final InputStream input)
throws BaseXException {
cmd.setInput(input);
cmd.execute(ctx);
info = cmd.info();
}
@Override
public LocalQuery query(final String query) throws BaseXException {
return new LocalQuery(query, ctx, out);
}
@Override
public synchronized void close() {
try {
execute(new Exit());
} catch(final IOException ex) {
Util.debug(ex);
}
}
@Override
protected void execute(final String str, final OutputStream os)
throws BaseXException {
try {
execute(new CommandParser(str, ctx).parseSingle(), os);
} catch(final QueryException ex) {
throw new BaseXException(ex);
}
}
@Override
protected void execute(final Command cmd, final OutputStream os)
throws BaseXException {
cmd.execute(ctx, os);
info = cmd.info();
}
}