/** @syncpriority 200 */
 public void requestCachedSources() {
   if (!receiving) return;
   Set<SourceStatus> sources = mina.getSourceMgr().getReadySources(streamId);
   for (SourceStatus sourceStat : sources) {
     // This is a bit kludgy - get the streamstatus that applies to us
     StreamStatus streamStat = null;
     for (StreamStatus testSs : sourceStat.getSsList()) {
       if (testSs.getStreamId().equals(streamId)) {
         streamStat = testSs;
         break;
       }
     }
     if (streamStat == null) throw new SeekInnerCalmException();
     foundSource(sourceStat, streamStat);
   }
 }
 public StreamStatus buildStreamStatus(String toNodeId) {
   StreamStatus.Builder bldr = StreamStatus.newBuilder();
   if (toNodeId != null) {
     bldr.setToNodeId(toNodeId);
     bldr.setFromNodeId(mina.getMyNodeId());
   }
   bldr.setStreamId(streamId);
   if (pageBuf.getTotalPages() > 0) bldr.setTotalPages(pageBuf.getTotalPages());
   StreamPosition sp = pageBuf.getStreamPosition();
   bldr.setLastContiguousPage(sp.getLastContiguousPage());
   if (sp.getPageMap() > 0) bldr.setPageMap(sp.getPageMap());
   return bldr.build();
 }
  public void foundSource(SourceStatus sourceStat, StreamStatus streamStat) {
    String fromNodeId = sourceStat.getFromNode().getId();
    String sourceId = fromNodeId;
    if (streamStat.getTotalPages() != 0) {
      long totalPages = streamStat.getTotalPages();
      if (pageBuf == null) this.totalPages = totalPages;
      else {
        if (pageBuf.getTotalPages() <= 0) pageBuf.setTotalPages(totalPages);
        else {
          if (pageBuf.getTotalPages() != totalPages) {
            log.error(
                "Node "
                    + sourceId
                    + " advertised total pages "
                    + totalPages
                    + " for stream "
                    + streamId
                    + ", but I have already recorded "
                    + pageBuf.getTotalPages());
            return;
          }
        }
      }
    }

    if (streamConns.haveListenConnWithId(sourceId)) return;

    // If we're not receiving, then we're just caching sources to pass to an external listener - so
    // cache it
    if (!receiving) {
      mina.getSourceMgr().cacheSourceUntilReady(sourceStat, streamStat);
      notifyListenersOfSource(sourceId);
      return;
    }

    // Not listening to this node - let's see if we should
    if (mina.getConfig().isAgoric()) {
      if (!bidStrategy.worthConnectingTo(new AuctionState(sourceStat.getAuctionState()))) {
        log.debug(
            "Not connecting to node " + sourceId + " for " + streamId + " - bid strategy says no");
        mina.getSourceMgr().cacheSourceUntilAgoricsAcceptable(sourceStat, streamStat);
        return;
      }
    }

    // Check that they have data useful to us
    if (pageBuf != null) {
      StreamPosition sp =
          new StreamPosition(streamStat.getLastContiguousPage(), streamStat.getPageMap());
      if (sp.highestIncludedPage() <= pageBuf.getLastContiguousPage()) {
        // Useless at the moment - cache them and ask again later
        mina.getSourceMgr().cacheSourceUntilDataAvailable(sourceStat, streamStat);
        return;
      }
    }

    // This is a useful source - let our listeners know
    notifyListenersOfSource(sourceId);

    if (streamConns.getNumListenConns() >= mina.getConfig().getMaxSources()) {
      mina.getSourceMgr().cacheSourceUntilReady(sourceStat, streamStat);
      return;
    }
    try {
      streamConns.makeListenConnectionTo(sourceStat);
    } catch (MinaConnectionException e) {
      log.error("Caught MinaConnectionException when attempting to connect to " + sourceId);
    }
  }