/** Get cash on hand, divide it by the number of outlinks and apply. */
 @Override
 public void distributeScoreToOutlinks(
     String fromUrl, WebPage row, Collection<ScoreDatum> scoreData, int allCount) {
   ByteBuffer cashRaw = row.getMetadata().get(CASH_KEY);
   if (cashRaw == null) {
     return;
   }
   float cash = Bytes.toFloat(cashRaw.array(), cashRaw.arrayOffset() + cashRaw.position());
   if (cash == 0) {
     return;
   }
   // TODO: count filtered vs. all count for outlinks
   float scoreUnit = cash / allCount;
   // internal and external score factor
   float internalScore = scoreUnit * internalScoreFactor;
   float externalScore = scoreUnit * externalScoreFactor;
   for (ScoreDatum scoreDatum : scoreData) {
     try {
       String toHost = new URL(scoreDatum.getUrl()).getHost();
       String fromHost = new URL(fromUrl.toString()).getHost();
       if (toHost.equalsIgnoreCase(fromHost)) {
         scoreDatum.setScore(internalScore);
       } else {
         scoreDatum.setScore(externalScore);
       }
     } catch (MalformedURLException e) {
       LOG.error("Failed with the following MalformedURLException: ", e);
       scoreDatum.setScore(externalScore);
     }
   }
   // reset cash to zero
   row.getMetadata().put(CASH_KEY, ByteBuffer.wrap(Bytes.toBytes(0.0f)));
 }
  /** Increase the score by a sum of inlinked scores. */
  @Override
  public void updateScore(String url, WebPage page, List<ScoreDatum> inlinkedScoreData) {
    float score = page.getScore();
    for (ScoreDatum scoreDatum : inlinkedScoreData) {
      LOG.trace("adding <" + scoreDatum.getUrl() + ", " + scoreDatum.getScore() + ">");
      score += scoreDatum.getScore();
    }
    LOG.trace(url + ": " + score + " (" + page.getScore() + ")");
    page.setScore(score);

    ByteBuffer cashRaw = page.getMetadata().get(CASH_KEY);
    float cash = 1.0f;
    if (cashRaw != null) {
      cash = Bytes.toFloat(cashRaw.array(), cashRaw.arrayOffset() + cashRaw.position());
    }
    page.getMetadata().put(CASH_KEY, ByteBuffer.wrap(Bytes.toBytes(cash + score)));
  }
 /**
  * Set to 1.0f. The initial value should equal the injected value, and it should (obviously) be
  * non-zero.
  */
 @Override
 public void initialScore(String url, WebPage row) throws ScoringFilterException {
   row.setScore(1.0f);
   row.getMetadata().put(CASH_KEY, ByteBuffer.wrap(Bytes.toBytes(1.0f)));
 }
 @Override
 public void injectedScore(String url, WebPage row) throws ScoringFilterException {
   float score = row.getScore();
   row.getMetadata().put(CASH_KEY, ByteBuffer.wrap(Bytes.toBytes(score)));
 }