package org.yamcs.artemis;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.yamcs.tctm.ParameterDataLinkInitialiser;
import org.yamcs.api.YamcsApiException;
import org.yamcs.api.artemis.Protocol;
import org.yamcs.protobuf.Pvalue.ParameterData;
import org.yamcs.protobuf.Pvalue.ParameterData.Builder;
import org.yamcs.protobuf.Yamcs.NamedObjectId;
import org.yamcs.protobuf.Pvalue.ParameterValue;
import org.yamcs.yarch.DataType;
import org.yamcs.yarch.Tuple;
import org.yamcs.yarch.TupleDefinition;
/**
* Translates between Processed Parameter tuples and ActiveMQ messages.
* @author atu
*/
public class PpTupleTranslator implements TupleTranslator {
@Override
public ClientMessage buildMessage( ClientMessage msg, Tuple tuple ) {
long genTime = (Long)tuple.getColumn(ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_GENTIME);
msg.putLongProperty( ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_GENTIME, genTime);
String ppGroup =(String)tuple.getColumn(ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_GROUP);
msg.putStringProperty( ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_GROUP, ppGroup);
msg.putIntProperty( ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_SEQ_NUM, (Integer)tuple.getColumn(ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_SEQ_NUM) );
msg.putLongProperty( ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_RECTIME, (Long)tuple.getColumn(ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_RECTIME) );
Builder b = ParameterData.newBuilder();
b.setGenerationTime(genTime);
b.setGroup(ppGroup);
for( int i = 4; i < tuple.size(); i++ ) {
// PP name is part of the instance
org.yamcs.parameter.ParameterValue ppValue = (org.yamcs.parameter.ParameterValue)tuple.getColumn(i);
b.addParameter(ppValue.toGpb(NamedObjectId.newBuilder().setName(ppValue.getParameterQualifiedNamed()).build()));
}
Protocol.encode(msg, b.build());
return msg;
}
@Override
public Tuple buildTuple( TupleDefinition tdef, ClientMessage message ) {
Tuple t = null;
try {
ParameterData pd = (ParameterData)Protocol.decode(message, ParameterData.newBuilder());
TupleDefinition tupleDef = tdef.copy();
ArrayList<Object> columns = new ArrayList<Object>( 4 + pd.getParameterCount() );
columns.add(message.getLongProperty( ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_GENTIME ));
columns.add(message.getStringProperty( ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_GROUP ));
columns.add(message.getIntProperty( ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_SEQ_NUM ));
columns.add(message.getLongProperty( ParameterDataLinkInitialiser.PARAMETER_TUPLE_COL_RECTIME ));
for( ParameterValue pv : pd.getParameterList() ) {
String processedParameterName = pv.getId().getName();
if( processedParameterName == null || "".equals( processedParameterName ) ) {
throw new InvalidParameterException( "Processed Parameter must have a name." );
}
tupleDef.addColumn( processedParameterName, DataType.PARAMETER_VALUE);
columns.add( org.yamcs.parameter.ParameterValue.fromGpb(processedParameterName, pv));
}
t = new Tuple(tupleDef, columns);
} catch( YamcsApiException e ) {
throw new IllegalArgumentException(e.toString());
}
return t;
}
}