@Override
    public void valueChanged(ListSelectionEvent e) {

      if (!e.getValueIsAdjusting()) {
        int rowNum = table.getSelectedRow();
        if (rowNum >= 0) {
          // get table model
          PeptideSpeciesPSMTableModel pepTableModel =
              (PeptideSpeciesPSMTableModel) table.getModel();

          // get spectrum reference column
          int identColNum =
              pepTableModel.getColumnIndex(PeptideTableHeader.IDENTIFICATION_ID.getHeader());
          int peptideColNum =
              pepTableModel.getColumnIndex(PeptideTableHeader.PEPTIDE_ID.getHeader());

          // get spectrum id
          int modelRowIndex = table.convertRowIndexToModel(rowNum);
          Comparable identId = (Comparable) pepTableModel.getValueAt(modelRowIndex, identColNum);
          Comparable peptideId =
              (Comparable) pepTableModel.getValueAt(modelRowIndex, peptideColNum);

          logger.debug(
              "Peptide table selection:  Protein id: " + identId + " Peptide Id: " + peptideId);

          // fire a background task to retrieve peptide
          if (peptideId != null && identId != null) {
            // publish the event to local event bus
            EventService eventBus =
                ContainerEventServiceFinder.getEventService(PeptidePSMPane.this);
            eventBus.publish(new PSMEvent(PeptidePSMPane.this, controller, identId, peptideId));
          }
        }
      }
    }
  private static void process(EventTopicSubscriber topicAnnotation, Object obj, Method method) {
    // Check args
    String topic = topicAnnotation.topic();
    if (topic == null) {
      throw new IllegalArgumentException(
          "Topic cannot be null for EventTopicSubscriber annotation");
    }

    // Get event service
    Class<? extends EventService> eventServiceClass = topicAnnotation.autoCreateEventServiceClass();
    String eventServiceName = topicAnnotation.eventServiceName();
    EventService eventService = getEventServiceFromAnnotation(eventServiceName, eventServiceClass);

    // Create proxy and subscribe
    ProxyTopicSubscriber subscriber =
        new ProxyTopicSubscriber(
            obj, method, topicAnnotation.referenceStrength(), eventService, topic);

    // See Issue #18
    // Also note that this post is wrong:
    // https://eventbus.dev.java.net/servlets/ProjectForumMessageView?messageID=19499&forumID=1834
    // Since two WeakReferences are not treated as one.  So this always has to be strong and we'll
    // have to clean up occasionally.
    eventService.subscribeStrongly(topic, subscriber);
  }
  @Override
  public void subscribeToEventBus(EventService eventBus) {
    if (eventBus == null) {
      eventBus = ContainerEventServiceFinder.getEventService(this);
    }
    peptideSpeciesEventSubscriber = new PeptideSpeciesEventSubscriber(psmTable);
    eventBus.subscribe(PeptideSpeciesEvent.class, peptideSpeciesEventSubscriber);

    changeRankingThresholdEventSubscriber = new ChangeRankingThresholdEventSubscriber(psmTable);
    eventBus.subscribe(ChangeRankingThresholdEvent.class, changeRankingThresholdEventSubscriber);
  }
  private static void process(EventSubscriber annotation, Object obj, Method method) {
    // Check args
    Class eventClass = annotation.eventClass();
    if (eventClass == null) {
      throw new IllegalArgumentException(
          "Event class cannot be null for EventSubscriber annotation");
    } else if (UseTheClassOfTheAnnotatedMethodsParameter.class.equals(eventClass)) {
      Class[] params = method.getParameterTypes();
      if (params.length < 1) {
        throw new RuntimeException("Expected annotated method to have one parameter.");
      } else {
        eventClass = params[0];
      }
    }

    // Get event service
    Class<? extends EventService> eventServiceClass = annotation.autoCreateEventServiceClass();
    String eventServiceName = annotation.eventServiceName();
    EventService eventService = getEventServiceFromAnnotation(eventServiceName, eventServiceClass);

    // Create proxy and subscribe
    // See
    // https://eventbus.dev.java.net/servlets/ProjectForumMessageView?messageID=19499&forumID=1834
    BaseProxySubscriber subscriber =
        new BaseProxySubscriber(
            obj, method, annotation.referenceStrength(), eventService, eventClass);
    if (annotation.exact()) {
      // See Issue #18
      // Also note that this post is wrong:
      // https://eventbus.dev.java.net/servlets/ProjectForumMessageView?messageID=19499&forumID=1834
      // Since two WeakReferences are not treated as one.  So this always has to be strong and we'll
      // have to clean up occasionally.
      eventService.subscribeExactlyStrongly(eventClass, subscriber);
    } else {
      // See Issue #18
      // Also note that this post is wrong:
      // https://eventbus.dev.java.net/servlets/ProjectForumMessageView?messageID=19499&forumID=1834
      // Since two WeakReferences are not treated as one.  So this always has to be strong and we'll
      // have to clean up occasionally.
      eventService.subscribeStrongly(eventClass, subscriber);
    }
  }