/** * 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.apache.log4j.Logger; import org.dspace.checker.dao.MostRecentChecksumDAO; import org.dspace.checker.service.ChecksumResultService; import org.dspace.checker.service.MostRecentChecksumService; import org.dspace.content.Bitstream; import org.dspace.content.service.BitstreamService; import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import java.sql.SQLException; import java.util.Date; import java.util.List; /** * Service implementation for the MostRecentChecksum object. * This class is responsible for all business logic calls for the MostRecentChecksum object and is autowired by spring. * This class should never be accessed directly. * * @author kevinvandevelde at atmire.com */ public class MostRecentChecksumServiceImpl implements MostRecentChecksumService { private static final Logger log = Logger.getLogger(MostRecentChecksumServiceImpl.class); @Autowired(required = true) protected MostRecentChecksumDAO mostRecentChecksumDAO; @Autowired(required = true) protected ChecksumResultService checksumResultService; @Autowired(required = true) protected BitstreamService bitstreamService; protected MostRecentChecksumServiceImpl() { } @Override public MostRecentChecksum getNonPersistedObject() { return new MostRecentChecksum(); } @Override public MostRecentChecksum findByBitstream(Context context, Bitstream bitstream) throws SQLException { return mostRecentChecksumDAO.findByBitstream(context, bitstream); } /** * Find all bitstreams that were set to not be processed for the specified * date range. * * @param context Context * @param startDate * the start of the date range * @param endDate * the end of the date range * @return a list of BitstreamHistoryInfo objects * @throws SQLException if database error */ @Override public List<MostRecentChecksum> findNotProcessedBitstreamsReport(Context context, Date startDate, Date endDate) throws SQLException { return mostRecentChecksumDAO.findByNotProcessedInDateRange(context, startDate, endDate); } /** * Select the most recent bitstream for a given date range with the * specified status. * * @param context Context * @param startDate * the start date range * @param endDate * the end date range. * @param resultCode * the result code * * @return a list of BitstreamHistoryInfo objects * @throws SQLException if database error */ @Override public List<MostRecentChecksum> findBitstreamResultTypeReport(Context context, Date startDate, Date endDate, ChecksumResultCode resultCode) throws SQLException { return mostRecentChecksumDAO.findByResultTypeInDateRange(context, startDate, endDate, resultCode); } /** * Queries the bitstream table for bitstream IDs that are not yet in the * most_recent_checksum table, and inserts them into the * most_recent_checksum and checksum_history tables. * @param context Context * @throws SQLException if database error */ @Override public void updateMissingBitstreams(Context context) throws SQLException { // "insert into most_recent_checksum ( " // + "bitstream_id, to_be_processed, expected_checksum, current_checksum, " // + "last_process_start_date, last_process_end_date, " // + "checksum_algorithm, matched_prev_checksum, result ) " // + "select bitstream.bitstream_id, " // + "CASE WHEN bitstream.deleted = false THEN true ELSE false END, " // + "CASE WHEN bitstream.checksum IS NULL THEN '' ELSE bitstream.checksum END, " // + "CASE WHEN bitstream.checksum IS NULL THEN '' ELSE bitstream.checksum END, " // + "?, ?, CASE WHEN bitstream.checksum_algorithm IS NULL " // + "THEN 'MD5' ELSE bitstream.checksum_algorithm END, true, " // + "CASE WHEN bitstream.deleted = true THEN 'BITSTREAM_MARKED_DELETED' else 'CHECKSUM_MATCH' END " // + "from bitstream where not exists( " // + "select 'x' from most_recent_checksum " // + "where most_recent_checksum.bitstream_id = bitstream.bitstream_id )"; List<Bitstream> unknownBitstreams = bitstreamService.findBitstreamsWithNoRecentChecksum(context); for (Bitstream bitstream : unknownBitstreams) { log.info(bitstream + " " + bitstream.getID().toString() + " " + bitstream.getName()); MostRecentChecksum mostRecentChecksum = new MostRecentChecksum(); mostRecentChecksum.setBitstream(bitstream); //Only process if our bitstream isn't deleted mostRecentChecksum.setToBeProcessed(!bitstream.isDeleted()); if(bitstream.getChecksum() == null) { mostRecentChecksum.setCurrentChecksum(""); mostRecentChecksum.setExpectedChecksum(""); }else{ mostRecentChecksum.setCurrentChecksum(bitstream.getChecksum()); mostRecentChecksum.setExpectedChecksum(bitstream.getChecksum()); } mostRecentChecksum.setProcessStartDate(new Date()); mostRecentChecksum.setProcessEndDate(new Date()); if(bitstream.getChecksumAlgorithm() == null) { mostRecentChecksum.setChecksumAlgorithm("MD5"); }else{ mostRecentChecksum.setChecksumAlgorithm(bitstream.getChecksumAlgorithm()); } mostRecentChecksum.setMatchedPrevChecksum(true); ChecksumResult checksumResult; if(bitstream.isDeleted()) { checksumResult = checksumResultService.findByCode(context, ChecksumResultCode.BITSTREAM_MARKED_DELETED); } else { checksumResult = checksumResultService.findByCode(context, ChecksumResultCode.CHECKSUM_MATCH); } mostRecentChecksum.setChecksumResult(checksumResult); mostRecentChecksumDAO.create(context, mostRecentChecksum); mostRecentChecksumDAO.save(context, mostRecentChecksum); } } @Override public void deleteByBitstream(Context context, Bitstream bitstream) throws SQLException { mostRecentChecksumDAO.deleteByBitstream(context, bitstream); } /** * Get the oldest most recent checksum record. If more than * one found the first one in the result set is returned. * * @param context COntext * @return the oldest MostRecentChecksum or NULL if the table is empty * @throws SQLException if database error * */ @Override public MostRecentChecksum findOldestRecord(Context context) throws SQLException { return mostRecentChecksumDAO.getOldestRecord(context); } /** * Returns the oldest bitstream that in the set of bitstreams that are less * than the specified date. If no bitstreams are found -1 is returned. * * @param context context * @param lessThanDate date * @return id of olded bitstream or -1 if not bitstreams are found * @throws SQLException if database error */ @Override public MostRecentChecksum findOldestRecord(Context context, Date lessThanDate) throws SQLException { return mostRecentChecksumDAO.getOldestRecord(context, lessThanDate); } @Override public List<MostRecentChecksum> findNotInHistory(Context context) throws SQLException { return mostRecentChecksumDAO.findNotInHistory(context); } @Override public void update(Context context, MostRecentChecksum mostRecentChecksum) throws SQLException { mostRecentChecksumDAO.save(context, mostRecentChecksum); } }