public String decode(CachedData d) {
      assert d.getFlags() == FLAGS : "expected " + FLAGS + " got " + d.getFlags();

      ByteBuffer bb = ByteBuffer.wrap(d.getData());

      int keyLength = bb.getInt();
      byte[] keyBytes = new byte[keyLength];
      bb.get(keyBytes);
      String k = new String(keyBytes);

      assertEquals(key, k);

      int valueLength = bb.getInt();
      byte[] valueBytes = new byte[valueLength];
      bb.get(valueBytes);

      return new String(valueBytes);
    }
  public SearchBean() {
    HttpServletRequest hsr =
        (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    javax.servlet.http.HttpServletResponse response =
        (javax.servlet.http.HttpServletResponse)
            FacesContext.getCurrentInstance().getExternalContext().getResponse();
    String term = hsr.getParameter("q").trim();

    if (term.length() < 1) {
      try {
        response.sendRedirect("/");
      } catch (Exception ex) {
      }
    }

    BiblePassage passage = BiblePassage.parse(term, CachedData.getBibleBooks(), true);
    if (passage != null) {
      try {
        response.sendRedirect("/bible/" + passage.getUrl());
      } catch (Exception ex) {
      }
    } else {

      if (!term.contains(" ")) {
        String baseWord = Topic.getBaseWord(term);
        Topic topic = Topic.loadByBaseWord(baseWord);
        if (topic != null) {
          try {
            response.sendRedirect("/topics/" + topic.getUrl());
          } catch (Exception ex) {
          }
        }
      } else {
        int verseId = TextSearch.findMatch(term);
        passage = BiblePassage.load(verseId, verseId);
        passage.populateVerses(AppUser.getCurrent().TranslationId);
        try {
          response.sendRedirect("/bible/" + passage.getUrl());
        } catch (Exception ex) {
        }
      }
    }
  }
 public String decode(CachedData d) {
   assert d.getFlags() == FLAGS : "expected " + FLAGS + " got " + d.getFlags();
   return new String(d.getData());
 }