package org.yamcs.cmdhistory;
import java.util.List;
import org.yamcs.ConfigurationException;
import org.yamcs.commanding.InvalidCommandId;
import org.yamcs.commanding.PreparedCommand;
import org.yamcs.parameter.Value;
import org.yamcs.protobuf.Commanding.CommandId;
import org.yamcs.tctm.TcUplinkerAdapter;
import org.yamcs.utils.ValueUtility;
import org.yamcs.yarch.ColumnDefinition;
import org.yamcs.yarch.Stream;
import org.yamcs.yarch.StreamSubscriber;
import org.yamcs.yarch.Tuple;
import org.yamcs.yarch.YarchDatabase;
import com.google.common.util.concurrent.AbstractService;
/**
*
* provides command history from streams
* @author nm
*
*/
public class StreamCommandHistoryProvider extends AbstractService implements CommandHistoryProvider, StreamSubscriber {
CommandHistoryRequestManager chrm;
Stream realtimeCmdHistoryStream;
@Override
public void setCommandHistoryRequestManager(CommandHistoryRequestManager chrm) {
this.chrm = chrm;
}
@Override
public void onTuple(Stream s, Tuple tuple) {
if(tuple.hasColumn(PreparedCommand.CNAME_SOURCE) && tuple.hasColumn(PreparedCommand.CNAME_BINARY)) {
PreparedCommand pc=PreparedCommand.fromTuple(tuple);
chrm.addCommand(pc);
} else {
int i=TcUplinkerAdapter.TC_TUPLE_DEFINITION.getColumnDefinitions().size();
CommandId cmdId=PreparedCommand.getCommandId(tuple);
List<ColumnDefinition> columns=tuple.getDefinition().getColumnDefinitions();
while(i<columns.size()) {
ColumnDefinition cd=columns.get(i++);
String key=cd.getName();
try {
Value v = ValueUtility.getColumnValue(cd, tuple.getColumn(key));
chrm.updateCommand(cmdId, key, v);
} catch (InvalidCommandId e) {
e.printStackTrace();
}
}
}
}
@Override
public void streamClosed(Stream stream) {
}
@Override
protected void doStart() {
String instance = chrm.getInstance();
YarchDatabase ydb = YarchDatabase.getInstance(chrm.getInstance());
Stream realtimeCmdHistoryStream = ydb.getStream(YarchCommandHistoryAdapter.REALTIME_CMDHIST_STREAM_NAME);
if(realtimeCmdHistoryStream == null) {
String msg ="Cannot find stream '"+YarchCommandHistoryAdapter.REALTIME_CMDHIST_STREAM_NAME+" in instance "+instance;
notifyFailed(new ConfigurationException(msg));
} else {
realtimeCmdHistoryStream.addSubscriber(this);
notifyStarted();
}
}
@Override
protected void doStop() {
realtimeCmdHistoryStream.removeSubscriber(this);
notifyStopped();
}
}