package org.yamcs.ui; import java.util.concurrent.Future; import org.yamcs.TimeInterval; import org.yamcs.ui.archivebrowser.ArchiveIndexListener; import org.yamcs.ui.archivebrowser.ArchiveIndexReceiver; import org.yamcs.utils.TimeEncoding; import org.yamcs.api.YamcsApiException; import org.yamcs.api.rest.BulkRestDataReceiver; import org.yamcs.api.rest.RestClient; import org.yamcs.protobuf.Yamcs.ArchiveTag; import org.yamcs.protobuf.Yamcs.DeleteTagRequest; import org.yamcs.protobuf.Yamcs.IndexResult; import org.yamcs.protobuf.Yamcs.TagResult; import org.yamcs.protobuf.Yamcs.UpsertTagRequest; import com.google.protobuf.InvalidProtocolBufferException; public class YamcsArchiveIndexReceiver implements ArchiveIndexReceiver { ArchiveIndexListener indexListener; volatile private boolean receiving = false; YamcsConnector yconnector; public YamcsArchiveIndexReceiver(YamcsConnector yconnector) { this.yconnector = yconnector; } @Override public void setIndexListener(ArchiveIndexListener ail) { this.indexListener=ail; } @Override public void getIndex(final String instance, final TimeInterval interval) { if(receiving){ indexListener.log("already receiving data"); return; } if( instance == null ) { indexListener.receiveArchiveRecordsError( "No yamcs instance to get data from" ); return; } yconnector.getExecutor().submit(new Runnable() { @Override public void run() { try { RestClient restClient = yconnector.getRestClient(); StringBuilder resource = new StringBuilder().append("/archive/"+instance+"/indexes?"); if(interval.hasStart()) resource.append("start="+TimeEncoding.toString(interval.getStart())); if(interval.hasStop()) resource.append("&stop="+TimeEncoding.toString(interval.getStop())); Future<Void> f = restClient.doBulkGetRequest(resource.toString(), new BulkRestDataReceiver() { @Override public void receiveData(byte[] data) throws YamcsApiException { try { indexListener.receiveArchiveRecords(IndexResult.parseFrom(data)); } catch (InvalidProtocolBufferException e) { throw new YamcsApiException("Error parsing index result: "+e.getMessage()); } } @Override public void receiveException(Throwable t) { indexListener.receiveArchiveRecordsError(t.getMessage()); } }); f.get(); indexListener.receiveArchiveRecordsFinished(); } catch (Exception e) { e.printStackTrace(); indexListener.receiveArchiveRecordsError(e.toString()); } finally { receiving=false; } }; }); } @Override public void getTag(final String instance, final TimeInterval interval) { //System.out.println("receiving tags for "+instance); if(receiving){ indexListener.log("already receiving data"); return; } yconnector.getExecutor().submit(new Runnable() { @Override public void run() { try { RestClient restClient = yconnector.getRestClient(); StringBuilder resource = new StringBuilder().append("/archive/"+instance+"/tags?"); if(interval.hasStart()) resource.append("start="+TimeEncoding.toString(interval.getStart())); if(interval.hasStop()) resource.append("&stop="+TimeEncoding.toString(interval.getStop())); Future<Void> f = restClient.doBulkGetRequest(resource.toString(), new BulkRestDataReceiver() { @Override public void receiveData(byte[] data) throws YamcsApiException { try { indexListener.receiveTags(TagResult.parseFrom(data).getTagList()); } catch (InvalidProtocolBufferException e) { throw new YamcsApiException("Error parsing tag result: "+e.getMessage()); } } @Override public void receiveException(Throwable t) { indexListener.receiveArchiveRecordsError(t.getMessage()); } }); f.get(); indexListener.receiveTagsFinished(); } catch (Exception e) { e.printStackTrace(); indexListener.receiveArchiveRecordsError(e.getMessage()); } finally { receiving=false; } }; }); } @Override public void insertTag(String instance, ArchiveTag tag) { UpsertTagRequest utr=UpsertTagRequest.newBuilder().setNewTag(tag).build(); try { // ArchiveTag ntag=(ArchiveTag)yamcsClient.executeRpc((Protocol.getYarchIndexControlAddress(instance)), "upsertTag", utr, ArchiveTag.newBuilder()); // indexListener.tagAdded(ntag); } catch (Exception e) { indexListener.log("Failed to insert tag: "+e.getMessage()); } } @Override public void updateTag(String instance, ArchiveTag oldTag, ArchiveTag newTag) { UpsertTagRequest utr=UpsertTagRequest.newBuilder().setOldTag(oldTag).setNewTag(newTag).build(); try { // ArchiveTag ntag=(ArchiveTag)yamcsClient.executeRpc((Protocol.getYarchIndexControlAddress(instance)), "upsertTag", utr, ArchiveTag.newBuilder()); // indexListener.tagChanged(oldTag, ntag); } catch (Exception e) { indexListener.log("Failed to insert tag: "+e.getMessage()); } } @Override public void deleteTag(String instance, ArchiveTag tag) { DeleteTagRequest dtr=DeleteTagRequest.newBuilder().setTag(tag).build(); try { // ArchiveTag rtag=(ArchiveTag)yamcsClient.executeRpc((Protocol.getYarchIndexControlAddress(instance)), "deleteTag", dtr, ArchiveTag.newBuilder()); // indexListener.tagRemoved(rtag); } catch (Exception e) { indexListener.log("Failed to remove tag: "+e.getMessage()); } } @Override public boolean supportsTags() { return true; } }