package org.yamcs.ui.yamcsmonitor; import java.util.ArrayList; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; import org.yamcs.protobuf.YamcsManagement.LinkInfo; class LinkTableModel extends AbstractTableModel { private ArrayList<LinkInfo> links=new ArrayList<LinkInfo>(); private ArrayList<Long> lastDataCountIncrease=new ArrayList<Long>(); private ArrayList<ScheduledFuture<?>> schduledFutures=new ArrayList<ScheduledFuture<?>>(); ScheduledThreadPoolExecutor timer; public LinkTableModel(ScheduledThreadPoolExecutor timer) { this.timer=timer; } public void update(LinkInfo uli) { boolean found=false; for ( int i = 0; i < links.size(); ++i ) { LinkInfo li = links.get(i); if(li.getName().equals(uli.getName())) { if(uli.getDataCount()>li.getDataCount()) { lastDataCountIncrease.set(i, System.currentTimeMillis()); scheduleFireTableRowsUpdated(i); } links.set(i, uli); fireTableRowsUpdated(i, i); found=true; break; } } if(!found) { links.add(uli); lastDataCountIncrease.add(0L); schduledFutures.add(null); fireTableRowsInserted(links.size()-1, links.size()-1); } } /** * schedule a fire rows updated , to change the color of the line if no data has been received in the last two seconds * @param row */ private void scheduleFireTableRowsUpdated(final int row) { ScheduledFuture<?> future=schduledFutures.get(row); if(future!=null)future.cancel(false); future=timer.schedule(new Runnable() { @Override public void run() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { fireTableRowsUpdated(row, row); } }); } }, 2, TimeUnit.SECONDS); schduledFutures.set(row, future); } public boolean isDataCountIncreasing(int index) { return (System.currentTimeMillis()-lastDataCountIncrease.get(index))<1500; } public LinkInfo getLinkInfo(int index) { return ((index >= 0) && (index < links.size())) ? links.get(index) : null; } public void clear() { int len = links.size(); if (len > 0) { links.clear(); fireTableRowsDeleted(0, len - 1); } } private static final long serialVersionUID = 4531138066222987136L; private static final String[] columnNames = {"Name", "Type", "Spec", "Stream", "Status", "Data Count"}; @Override public String getColumnName(int col) { return columnNames[col]; } @Override public int getRowCount() { return links.size(); } @Override public int getColumnCount() { return columnNames.length; } @Override public Object getValueAt(int row, int col) { LinkInfo li = links.get(row); Object o=null; switch (col) { case 0: o=li.getName(); break; case 1: o=li.getType(); break; case 2: o=li.getSpec(); break; case 3: o=li.getStream(); break; case 4: o=li.getStatus(); break; case 5: o=li.getDataCount(); break; } return o; } @Override public boolean isCellEditable(int row, int col) { return false; } @Override public void setValueAt(Object value, int row, int col) {} }