@After
 public void tearDown() {
   pse.tearDown();
   pss.tearDown();
   mtf.tearDown();
   JMSConnectionFactory.getInstance().removeListener(Channels.getTheIndexServer(), listener);
   mjms.tearDown();
   rs.tearDown();
 }
  /**
   * Returns the ReplicaStoreState of a given file in a specific replica.
   *
   * @param filename The name of the file for the ReplicaStoreState.
   * @param replicaChannelName The name of the identification channel for uniquely identifying the
   *     replica of for the ReplicaStoreState.
   * @return The ReplicaStoreState of a given file in a specific replica.
   * @throws ArgumentNotValid If the filename or the replica id is null or the empty string.
   */
  @Override
  public ReplicaStoreState getState(String filename, String replicaChannelName)
      throws ArgumentNotValid {
    ArgumentNotValid.checkNotNullOrEmpty(filename, "String filename");
    ArgumentNotValid.checkNotNullOrEmpty(replicaChannelName, "String replicaChannelName");

    Replica rep = Channels.retrieveReplicaFromIdentifierChannel(replicaChannelName);

    // retrieve the ReplicaStoreState from the database.
    return database.getReplicaStoreState(filename, rep.getId());
  }
  /**
   * Message to signal from a BitarchiveServer to the BitarchiveMonitorServer that the Bit Archive
   * Application identified by BA_ApplicationId has completed its part of the batch job.
   *
   * <p>Holds status information: list of files processed and a list of ARC files (file names) on
   * which the batch job failed.
   *
   * @param to the channel to which this message is to be sent (must be a BAMON channel)
   * @param baAppId Identifier for the machine sending this message, usually containing the IP
   *     address and http port number
   * @param originatingBatchMsgId the Id field from the original batch message
   * @param rf he remote file reference containing the output of the batch job (may be null if no
   *     output is generated).
   * @throws ArgumentNotValid If the BA_ApplicationId or the originatingBatchMsgId are null or
   *     empty, or if the channel 'to' is null.
   */
  public BatchEndedMessage(
      ChannelID to, String baAppId, String originatingBatchMsgId, RemoteFile rf)
      throws ArgumentNotValid {
    super(to, Channels.getError());
    ArgumentNotValid.checkNotNull(to, "ChannelID to");
    ArgumentNotValid.checkNotNullOrEmpty(baAppId, "String baAppId");
    ArgumentNotValid.checkNotNullOrEmpty(originatingBatchMsgId, "String originatingBatchMsgId");

    this.baApplicationId = baAppId;
    this.originatingBatchMsgId = originatingBatchMsgId;
    this.rf = rf;
  }
  /**
   * Sets the store state of an entry to a specific value.
   *
   * @param filename The name of the file for the entry.
   * @param repChannelId The identification channel of the replica for the entry.
   * @param state The new state for the entry.
   * @throws ArgumentNotValid If the ReplicaStoreState is null, or if either the filename or the
   *     replica identification channel is either null or the empty string.
   */
  @Override
  public void setState(String filename, String repChannelId, ReplicaStoreState state)
      throws ArgumentNotValid {
    ArgumentNotValid.checkNotNull(state, "ReplicaStoreState state");
    ArgumentNotValid.checkNotNullOrEmpty(filename, "String filename");
    ArgumentNotValid.checkNotNullOrEmpty(repChannelId, "String repChannelId");

    // retrieve the replica
    Replica rep = Channels.retrieveReplicaFromIdentifierChannel(repChannelId);

    // update the database.
    database.setReplicaStoreState(filename, rep.getId(), state);
  }
 @Before
 public void setUp() {
   rs.setUp();
   mjms.setUp();
   listener = new CreateIndexListener();
   JMSConnectionFactory.getInstance().setListener(Channels.getTheIndexServer(), listener);
   Settings.set(
       CommonSettings.REMOTE_FILE_CLASS, "dk.netarkivet.common.distribute.NullRemoteFile");
   Settings.set(CommonSettings.CACHE_DIR, TestInfo.CACHE_DIR.getPath());
   mtf.setUp();
   pss.setUp();
   pse.setUp();
 }
  /**
   * Message to signal from a BitarchiveServer to the BitarchiveMonitorServer that the Bit Archive
   * Application identified by BA_ApplicationId has completed its part of the batch job.
   *
   * <p>Holds status information: list of files processed and a list of ARC files (file names) on
   * which the batch job failed.
   *
   * @param to the channel to which this message is to be sent (must be a BAMON channel)
   * @param originatingBatchMsgId the Id field from the original batch message
   * @param status The object containing status info.
   */
  public BatchEndedMessage(ChannelID to, String originatingBatchMsgId, BatchStatus status) {
    super(to, Channels.getError());
    ArgumentNotValid.checkNotNull(to, "to");
    ArgumentNotValid.checkNotNullOrEmpty(originatingBatchMsgId, "String originatingBatchMsgId");
    ArgumentNotValid.checkNotNull(status, "BatchStatus status");

    this.originatingBatchMsgId = originatingBatchMsgId;
    this.baApplicationId = status.getBitArchiveAppId();
    this.rf = status.getResultFile();
    this.noOfFilesProcessed = status.getNoOfFilesProcessed();
    this.filesFailed = status.getFilesFailed();
    this.exceptions = status.getExceptions();
  }
  /**
   * Determines whether a given file in a specific replica has a valid replica store state. By valid
   * means a replica store state other that UNKNOWN_UPLOAD_STATE.
   *
   * <p>TODO Find out if the assumption that all upload states besides UNKNOWN_UPLOAD_STATE are
   * acceptable!
   *
   * @param filename The name of the file for the ReplicaStoreState.
   * @param repChannelId The identification channel of the replica for the ReplicaStoreState.
   * @return Whether a given file in a specific replica has a valid store state.
   * @throws ArgumentNotValid If either the filenames or the replica identification channel is null
   *     or the empty string.
   */
  @Override
  public boolean hasState(String filename, String repChannelId) throws ArgumentNotValid {
    ArgumentNotValid.checkNotNullOrEmpty(filename, "String filename");
    ArgumentNotValid.checkNotNullOrEmpty(repChannelId, "String repChannelId");

    // retrieve the replica
    Replica rep = Channels.retrieveReplicaFromIdentifierChannel(repChannelId);

    // retrieve the state for the entry for the replica and filename
    ReplicaStoreState state = database.getReplicaStoreState(filename, rep.getId());

    // return whether the entry has a known upload state
    return state != ReplicaStoreState.UNKNOWN_UPLOAD_STATE;
  }
  /** Disabled, fails on Jenkins */
  public void failingTestArcRepositoryCalls() {
    DatabaseAdmin da = DatabaseAdmin.getInstance();

    assertFalse("Should not contain NON-EXISTING-FILE", da.hasEntry("NON-EXISTING-FILE"));
    assertFalse(
        "Should not contain StoreMessage for NON-EXISTING-FILE",
        da.hasReplyInfo("NON-EXISTING-FILE"));

    StoreMessage storeMsg1 = new StoreMessage(Channels.getError(), TestInfo.TEST_FILE_1);
    JMSConnectionMockupMQ.updateMsgID(storeMsg1, "store1");

    da.addEntry(TestInfo.TEST_FILE_1.getName(), storeMsg1, "1234567890");

    // make sure that the test instance can now be found.
    assertTrue(
        "Should contain " + TestInfo.TEST_FILE_1.getName(),
        da.hasEntry(TestInfo.TEST_FILE_1.getName()));
    assertTrue(
        "Should have replyInfo for " + TestInfo.TEST_FILE_1.getName(),
        da.hasReplyInfo(TestInfo.TEST_FILE_1.getName()));
    assertEquals(
        "Should have the given checksum",
        "1234567890",
        da.getCheckSum(TestInfo.TEST_FILE_1.getName()));

    // Test the hasState.
    assertFalse(
        "Should not yet have a acceptable state",
        da.hasState(TestInfo.TEST_FILE_1.getName(), ONE.getIdentificationChannel().getName()));
    da.setState(
        TestInfo.TEST_FILE_1.getName(),
        ONE.getIdentificationChannel().getName(),
        ReplicaStoreState.UPLOAD_STARTED);
    assertTrue(
        "Should now have a acceptable state",
        da.hasState(TestInfo.TEST_FILE_1.getName(), ONE.getIdentificationChannel().getName()));
    assertEquals(
        "Should have the same state",
        da.getState(TestInfo.TEST_FILE_1.getName(), ONE.getIdentificationChannel().getName()),
        ReplicaStoreState.UPLOAD_STARTED);

    StoreMessage storeMsg2 = new StoreMessage(Channels.getError(), TestInfo.TEST_FILE_1);
    JMSConnectionMockupMQ.updateMsgID(storeMsg2, "store2");

    da.setReplyInfo(storeMsg2.getArcfileName(), storeMsg2);

    da.setState(
        TestInfo.TEST_FILE_1.getName(),
        ONE.getIdentificationChannel().getName(),
        ReplicaStoreState.UPLOAD_COMPLETED);
    da.setState(
        TestInfo.TEST_FILE_1.getName(),
        TWO.getIdentificationChannel().getName(),
        ReplicaStoreState.UPLOAD_COMPLETED);
    da.setState(
        TestInfo.TEST_FILE_1.getName(),
        THREE.getIdentificationChannel().getName(),
        ReplicaStoreState.UPLOAD_COMPLETED);

    StoreMessage retrievedMsg = da.removeReplyInfo(TestInfo.TEST_FILE_1.getName());

    assertEquals("The message should have the new ID.", "store2", retrievedMsg.getID());

    try {
      da.setCheckSum(TestInfo.TEST_FILE_1.getName(), "0987654321");
      fail("An illegal state exception should be thrown here.");
    } catch (IllegalState e) {
      // expected
    }

    Set<String> filenames = da.getAllFileNames();
    assertTrue(
        "Should contain the file '" + TestInfo.TEST_FILE_1.getName() + "' but was '" + filenames,
        filenames.contains(TestInfo.TEST_FILE_1.getName()));

    filenames = da.getAllFileNames(THREE, ReplicaStoreState.UPLOAD_FAILED);
    assertTrue(
        "The list of files with state UPLOAD_FAILED for replica "
            + "THREE should be empty, but it was: "
            + filenames,
        filenames.isEmpty());

    filenames = da.getAllFileNames(THREE, ReplicaStoreState.UPLOAD_COMPLETED);
    assertTrue(
        "The list of files with state UPLOAD_COMPLETED for replica "
            + "THREE should contain the file: '"
            + TestInfo.TEST_FILE_1.getName()
            + "', but it contained: "
            + filenames,
        filenames.contains(TestInfo.TEST_FILE_1.getName()));
  }