public void update(final Observable observable, final Object object) {
        final AbstractTraceMessage message = (AbstractTraceMessage) object;
//        LOGGER.info(message.getText());
        if ((NodeSelectorPanel.isSelected(message.getUrn()))
                && (message.getText().startsWith(prefixUni))) {
//            LOGGER.info("Neighbor@" + message.getTime() + ":" + message.getUrn());
            final String target = message.getText().split(delimiter)[1];
            if ((message.getText().contains(prefixBidi))) {
                LOGGER.debug("new nbb"+message.getUrn()+" "+message.getStrLine());
                if (neighborsBidi.containsKey(message.getUrn())) {
                    final HashMap<String, Integer> tmp = neighborsBidi.get(message.getUrn());


                    tmp.put(target, 1);

                    neighborsBidi.put(message.getUrn(), tmp);
                    LOGGER.debug(message.getText());
                    LOGGER.debug(message.getUrn() + " nb size: " + tmp.size());
                } else {
                    final HashMap tmp = new HashMap<String, Integer>();
                    tmp.put(target, 1);
                    neighborsBidi.put(message.getUrn(), tmp);
                    LOGGER.debug(message.getText());
                    LOGGER.debug(message.getUrn() + " nb size: " + tmp.size());
                }
                synchronized (this) {
                    final double avgVal = getAvgNeighbors();
                    final double minVal = getMinNeighbors();
                    final double maxVal = getMaxNeighbors();
                    final double timeDouble = ((message.getTime() - TraceFile.getInstance().getStartTime()) / 1000);
                    LOGGER.info("@" + timeDouble + " : a" + avgVal + " l" + minVal + " h" + maxVal + " ");
                    series[0].addOrUpdate((int) timeDouble, avgVal);
                    series[1].addOrUpdate((int) timeDouble, minVal);
                    series[2].addOrUpdate((int) timeDouble, maxVal);
                }
            } else if (((message.getText().contains(prefixDrop)) || (message.getText().contains(prefixLost))) &&
                    (neighborsBidi.containsKey(message.getUrn()))) {
                final HashMap<String, Integer> tmp = neighborsBidi.get(message.getUrn());
                tmp.remove(target);
                neighborsBidi.put(message.getUrn(), tmp);
                LOGGER.debug(message.getText());
                LOGGER.debug(message.getUrn() + " nb size: " + tmp.size());
                synchronized (this) {
                    final double avgVal = getAvgNeighbors();
                    final double minVal = getMinNeighbors();
                    final double maxVal = getMaxNeighbors();
                    final double timeDouble = ((message.getTime() - TraceFile.getInstance().getStartTime()) / 1000);
                    LOGGER.info("@" + timeDouble + " : a" + avgVal + " l" + minVal + " h" + maxVal + " ");
                    series[0].addOrUpdate((int) timeDouble, avgVal);
                    series[1].addOrUpdate((int) timeDouble, minVal);
                    series[2].addOrUpdate((int) timeDouble, maxVal);
                }
            }

        }
    }