/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.checker;
import org.dspace.checker.dao.ChecksumHistoryDAO;
import org.dspace.checker.service.ChecksumHistoryService;
import org.dspace.checker.service.ChecksumResultService;
import org.dspace.checker.service.MostRecentChecksumService;
import org.dspace.content.Bitstream;
import org.dspace.core.Context;
import org.springframework.beans.factory.annotation.Autowired;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* Service implementation for the ChecksumHistory object.
* This class is responsible for all business logic calls for the ChecksumHistory object and is autowired by spring.
* This class should never be accessed directly.
*
* @author kevinvandevelde at atmire.com
*/
public class ChecksumHistoryServiceImpl implements ChecksumHistoryService {
@Autowired(required = true)
protected ChecksumHistoryDAO checksumHistoryDAO;
@Autowired(required = true)
protected MostRecentChecksumService mostRecentChecksumService;
@Autowired(required = true)
protected ChecksumResultService checksumResultService;
protected ChecksumHistoryServiceImpl()
{
}
@Override
public void updateMissingBitstreams(Context context) throws SQLException {
// "insert into checksum_history ( "
// + "bitstream_id, process_start_date, "
// + "process_end_date, checksum_expected, "
// + "checksum_calculated, result ) "
// + "select most_recent_checksum.bitstream_id, "
// + "most_recent_checksum.last_process_start_date, "
// + "most_recent_checksum.last_process_end_date, "
// + "most_recent_checksum.expected_checksum, most_recent_checksum.expected_checksum, "
// + "CASE WHEN bitstream.deleted = true THEN 'BITSTREAM_MARKED_DELETED' else 'CHECKSUM_MATCH' END "
// + "from most_recent_checksum, bitstream where "
// + "not exists( select 'x' from checksum_history where "
// + "most_recent_checksum.bitstream_id = checksum_history.bitstream_id ) "
// + "and most_recent_checksum.bitstream_id = bitstream.bitstream_id";
List<MostRecentChecksum> mostRecentChecksums = mostRecentChecksumService.findNotInHistory(context);
for (MostRecentChecksum mostRecentChecksum : mostRecentChecksums) {
addHistory(context, mostRecentChecksum);
}
}
@Override
public void addHistory(Context context, MostRecentChecksum mostRecentChecksum) throws SQLException {
ChecksumHistory checksumHistory = new ChecksumHistory();
checksumHistory.setBitstream(mostRecentChecksum.getBitstream());
checksumHistory.setProcessStartDate(mostRecentChecksum.getProcessStartDate());
checksumHistory.setProcessEndDate(mostRecentChecksum.getProcessEndDate());
checksumHistory.setChecksumExpected(mostRecentChecksum.getExpectedChecksum());
checksumHistory.setChecksumCalculated(mostRecentChecksum.getCurrentChecksum());
ChecksumResult checksumResult;
if(mostRecentChecksum.getBitstream().isDeleted())
{
checksumResult = checksumResultService.findByCode(context, ChecksumResultCode.BITSTREAM_MARKED_DELETED);
} else {
checksumResult = checksumResultService.findByCode(context, ChecksumResultCode.CHECKSUM_MATCH);
}
checksumHistory.setResult(checksumResult);
checksumHistoryDAO.create(context, checksumHistory);
checksumHistoryDAO.save(context, checksumHistory);
}
/**
* Delete the history records from the database.
*
* @param context Context
* @param retentionDate
* any records older than this data are deleted.
* @param checksumResultCode
* result code records must have for them to be deleted.
* @return number of records deleted.
* @throws SQLException if database error occurs.
*/
@Override
public int deleteByDateAndCode(Context context, Date retentionDate, ChecksumResultCode checksumResultCode) throws SQLException
{
return checksumHistoryDAO.deleteByDateAndCode(context, retentionDate, checksumResultCode);
}
@Override
public void deleteByBitstream(Context context, Bitstream bitstream) throws SQLException {
//Delete the most recent
mostRecentChecksumService.deleteByBitstream(context, bitstream);
//Delete the history as well
checksumHistoryDAO.deleteByBitstream(context, bitstream);
}
@Override
public int prune(Context context, Map<ChecksumResultCode, Long> interests) throws SQLException {
long now = System.currentTimeMillis();
int count = 0;
for (Map.Entry<ChecksumResultCode, Long> interest : interests.entrySet())
{
count += deleteByDateAndCode(context, new Date(now - interest.getValue().longValue()),
interest.getKey());
}
return count;
}
}