/**
* 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.harvest;
import org.dspace.content.Collection;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.harvest.dao.HarvestedCollectionDAO;
import org.dspace.harvest.service.HarvestedCollectionService;
import org.springframework.beans.factory.annotation.Autowired;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* Service implementation for the HarvestedCollection object.
* This class is responsible for all business logic calls for the HarvestedCollection object and is autowired by spring.
* This class should never be accessed directly.
*
* @author kevinvandevelde at atmire.com
*/
public class HarvestedCollectionServiceImpl implements HarvestedCollectionService
{
@Autowired(required = true)
protected HarvestedCollectionDAO harvestedCollectionDAO;
protected HarvestedCollectionServiceImpl()
{
}
@Override
public HarvestedCollection find(Context context, Collection collection) throws SQLException {
return harvestedCollectionDAO.findByCollection(context, collection);
}
@Override
public HarvestedCollection create(Context context, Collection collection) throws SQLException {
HarvestedCollection harvestedCollection = harvestedCollectionDAO.create(context, new HarvestedCollection());
harvestedCollection.setCollection(collection);
harvestedCollection.setHarvestType(HarvestedCollection.TYPE_NONE);
update(context, harvestedCollection);
return harvestedCollection; }
@Override
public boolean isHarvestable(Context context, Collection collection) throws SQLException {
HarvestedCollection hc = find(context, collection);
if (hc != null && hc.getHarvestType() > 0 && hc.getOaiSource() != null && hc.getOaiSetId() != null &&
hc.getHarvestStatus() != HarvestedCollection.STATUS_UNKNOWN_ERROR) {
return true;
}
return false;
}
@Override
public boolean isHarvestable(HarvestedCollection harvestedCollection) throws SQLException {
if (harvestedCollection.getHarvestType() > 0 && harvestedCollection.getOaiSource() != null && harvestedCollection.getOaiSetId() != null &&
harvestedCollection.getHarvestStatus() != HarvestedCollection.STATUS_UNKNOWN_ERROR) {
return true;
}
return false;
}
@Override
public boolean isReady(Context context, Collection collection) throws SQLException {
HarvestedCollection hc = find(context, collection);
return isReady(hc);
}
@Override
public boolean isReady(HarvestedCollection harvestedCollection) throws SQLException {
if (isHarvestable(harvestedCollection) && (harvestedCollection.getHarvestStatus() == HarvestedCollection.STATUS_READY || harvestedCollection.getHarvestStatus() == HarvestedCollection.STATUS_OAI_ERROR))
{
return true;
}
return false;
}
@Override
public List<HarvestedCollection> findAll(Context context) throws SQLException {
return harvestedCollectionDAO.findAll(context, HarvestedCollection.class);
}
@Override
public List<HarvestedCollection> findReady(Context context) throws SQLException {
int harvestInterval = ConfigurationManager.getIntProperty("oai", "harvester.harvestFrequency");
if (harvestInterval == 0)
{
harvestInterval = 720;
}
int expirationInterval = ConfigurationManager.getIntProperty("oai", "harvester.threadTimeout");
if (expirationInterval == 0)
{
expirationInterval = 24;
}
Date startTime;
Date expirationTime;
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.MINUTE, -1 * harvestInterval);
startTime = calendar.getTime();
calendar.setTime(startTime);
calendar.add(Calendar.HOUR, -2 * expirationInterval);
expirationTime = calendar.getTime();
int[] statuses = new int[]{HarvestedCollection.STATUS_READY, HarvestedCollection.STATUS_OAI_ERROR};
return harvestedCollectionDAO.findByLastHarvestedAndHarvestTypeAndHarvestStatusesAndHarvestTime(context, startTime, HarvestedCollection.TYPE_NONE, statuses, HarvestedCollection.STATUS_BUSY, expirationTime);
}
@Override
public List<HarvestedCollection> findByStatus(Context context, int status) throws SQLException {
return harvestedCollectionDAO.findByStatus(context, status);
}
@Override
public HarvestedCollection findOldestHarvest(Context context) throws SQLException {
return harvestedCollectionDAO.findByStatusAndMinimalTypeOrderByLastHarvestedAsc(context, HarvestedCollection.STATUS_READY, HarvestedCollection.TYPE_NONE, 1);
}
@Override
public HarvestedCollection findNewestHarvest(Context context) throws SQLException {
return harvestedCollectionDAO.findByStatusAndMinimalTypeOrderByLastHarvestedDesc(context, HarvestedCollection.STATUS_READY, HarvestedCollection.TYPE_NONE, 1);
}
@Override
public void delete(Context context, HarvestedCollection harvestedCollection) throws SQLException {
harvestedCollectionDAO.delete(context, harvestedCollection);
}
@Override
public void update(Context context, HarvestedCollection harvestedCollection) throws SQLException {
harvestedCollectionDAO.save(context, harvestedCollection);
}
@Override
public boolean exists(Context context) throws SQLException {
return 0 < harvestedCollectionDAO.count(context);
}
}