/**
   * Returns the cached recent messages history.
   *
   * @return
   * @throws IOException
   */
  private History getHistory() throws IOException {
    synchronized (historyID) {
      HistoryService historyService =
          MessageHistoryActivator.getMessageHistoryService().getHistoryService();

      if (history == null) {
        history = historyService.createHistory(historyID, recordStructure);

        // lets check the version if not our version, re-create
        // history (delete it)
        HistoryReader reader = history.getReader();
        boolean delete = false;
        QueryResultSet<HistoryRecord> res = reader.findLast(1);
        if (res != null && res.hasNext()) {
          HistoryRecord hr = res.next();
          if (hr.getPropertyValues().length >= 4) {
            if (!hr.getPropertyValues()[3].equals(RECENT_MSGS_VER)) delete = true;
          } else delete = true;
        }

        if (delete) {
          // delete it
          try {
            historyService.purgeLocallyStoredHistory(historyID);

            history = historyService.createHistory(historyID, recordStructure);
          } catch (IOException ex) {
            logger.error("Cannot delete recent_messages history", ex);
          }
        }
      }

      return history;
    }
  }
示例#2
0
  public void testWriteRecordsWithMaxNumber() {
    HistoryWriter writer = this.history.getWriter();
    HistoryReader reader = this.history.getReader();

    try {

      for (int i = 0; i < 20; i++) {
        writer.addRecord(new String[] {"" + i, "name" + i, i % 2 == 0 ? "m" : "f"}, 20);
        synchronized (this) {
          try {
            wait(100);
          } catch (Throwable t) {
          }
        }
      }

      QueryResultSet<HistoryRecord> recs = reader.findLast(20);
      int count = 0;
      while (recs.hasNext()) {
        count++;
        recs.next();
      }

      assertEquals("Wrong count of messages", 20, count);

      writer.addRecord(new String[] {"" + 21, "name" + 21, "f"}, 20);

      recs = reader.findLast(20);
      count = 0;
      boolean foundFirstMessage = false;
      while (recs.hasNext()) {
        count++;
        HistoryRecord hr = recs.next();

        if (hr.getPropertyValues()[0].equals("0")) foundFirstMessage = true;
      }

      assertEquals("Wrong count of messages", 20, count);

      assertFalse("Wrong message removed, must be the first one", foundFirstMessage);

    } catch (Exception e) {
      e.printStackTrace();
      fail("Could not write records. Reason: " + e);
    }
  }