package org.yamcs.web.rest.archive;
import org.yamcs.archive.CommandHistoryRecorder;
import org.yamcs.archive.GPBHelper;
import org.yamcs.protobuf.Commanding.CommandHistoryEntry;
import org.yamcs.protobuf.Rest.ListCommandsResponse;
import org.yamcs.protobuf.SchemaRest;
import org.yamcs.web.HttpException;
import org.yamcs.web.rest.RestHandler;
import org.yamcs.web.rest.RestRequest;
import org.yamcs.web.rest.RestRequest.IntervalResult;
import org.yamcs.web.rest.RestStreamSubscriber;
import org.yamcs.web.rest.RestStreams;
import org.yamcs.web.rest.Route;
import org.yamcs.web.rest.SqlBuilder;
import org.yamcs.xtce.MetaCommand;
import org.yamcs.xtce.XtceDb;
import org.yamcs.xtceproc.XtceDbFactory;
import org.yamcs.yarch.Stream;
import org.yamcs.yarch.Tuple;
public class ArchiveCommandRestHandler extends RestHandler {
@Route(path = "/api/archive/:instance/commands/:name*")
public void listCommands(RestRequest req) throws HttpException {
String instance = verifyInstance(req, req.getRouteParam("instance"));
long pos = req.getQueryParameterAsLong("pos", 0);
int limit = req.getQueryParameterAsInt("limit", 100);
SqlBuilder sqlb = new SqlBuilder(CommandHistoryRecorder.TABLE_NAME);
IntervalResult ir = req.scanForInterval();
if (ir.hasInterval()) {
sqlb.where(ir.asSqlCondition("gentime"));
}
if (req.hasRouteParam("name")) {
XtceDb mdb = XtceDbFactory.getInstance(instance);
MetaCommand cmd = verifyCommand(req, mdb, req.getRouteParam("name"));
sqlb.where("cmdName = '" + cmd.getQualifiedName() + "'");
}
sqlb.descend(req.asksDescending(true));
ListCommandsResponse.Builder responseb = ListCommandsResponse.newBuilder();
RestStreams.stream(instance, sqlb.toString(), new RestStreamSubscriber(pos, limit) {
@Override
public void processTuple(Stream stream, Tuple tuple) {
CommandHistoryEntry che = GPBHelper.tupleToCommandHistoryEntry(tuple);
responseb.addEntry(che);
}
@Override
public void streamClosed(Stream stream) {
completeOK(req, responseb.build(), SchemaRest.ListCommandsResponse.WRITE);
}
});
}
}