package org.yamcs.api;
import java.io.InputStream;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yamcs.ConfigurationException;
import org.yamcs.api.rest.RestClient;
import org.yamcs.protobuf.Yamcs.Event;
import org.yamcs.utils.TimeEncoding;
import org.yaml.snakeyaml.Yaml;
import io.netty.handler.codec.http.HttpMethod;
/**
* An EventProducer that publishes events over WebSocket
* <p>
* By default, repeated message are detected and reduced, resulting in pseudo
* events with a message like 'last event repeated X times'. This behaviour can
* be turned off.
*/
public class RestEventProducer extends AbstractEventProducer {
static final String CONF_REPEATED_EVENT_REDUCTION = "repeatedEventReduction";
RestClient restClient;
static Logger logger=LoggerFactory.getLogger(RestEventProducer.class);
static final int MAX_QUEUE_SIZE=1000;
ArrayBlockingQueue<Event> queue=new ArrayBlockingQueue<Event>(MAX_QUEUE_SIZE);
String eventResource;
YamcsConnectionProperties connProp;
public RestEventProducer(YamcsConnectionProperties connProp) {
restClient = new RestClient(connProp);
this.connProp = connProp;
eventResource = "/archive/"+connProp.getInstance()+"/events";
InputStream is = RestEventProducer.class.getResourceAsStream("/event-producer.yaml");
boolean repeatedEventReduction = true;
if(is!=null) {
Object o = new Yaml().load(is);
if(!(o instanceof Map<?,?>)) {
throw new ConfigurationException("event-producer.yaml does not contain a map but a "+o.getClass());
}
@SuppressWarnings("unchecked")
Map<String,Object> m = (Map<String, Object>) o;
if (m.containsKey(CONF_REPEATED_EVENT_REDUCTION)) {
repeatedEventReduction = (Boolean) m.get(CONF_REPEATED_EVENT_REDUCTION);
}
}
if (repeatedEventReduction) {
setRepeatedEventReduction(true, 60000);
}
}
@Override
public void close() {
restClient.close();
}
/* (non-Javadoc)
* @see org.yamcs.api.EventProducer#sendEvent(org.yamcs.protobuf.Yamcs.Event)
*/
@Override
public synchronized void sendEvent(Event event) {
logger.debug("Sending Event: {}", event.getMessage());
restClient.doRequest(eventResource, HttpMethod.POST, event.toByteArray());
}
@Override
public String toString() {
return RestEventProducer.class.getName()+" sendign events to "+connProp;
}
@Override
public long getMissionTime() {
return TimeEncoding.getWallclockTime();
}
public void main(String[] args) {
}
}