/**
* 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.apache.log4j.Logger;
import org.dspace.content.Collection;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService;
import org.dspace.core.Context;
import org.dspace.harvest.factory.HarvestServiceFactory;
import org.dspace.harvest.service.HarvestedCollectionService;
import java.sql.SQLException;
import java.util.UUID;
/**
* A harvester thread used to execute a single harvest cycle on a collection
* @author alexey
*/
public class HarvestThread extends Thread {
private static final Logger log = Logger.getLogger(HarvestThread.class);
protected UUID collectionId;
protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
protected HarvestedCollectionService harvestedCollectionService = HarvestServiceFactory.getInstance().getHarvestedCollectionService();
protected HarvestThread(UUID collectionId) throws SQLException {
this.collectionId = collectionId;
}
@Override
public void run()
{
log.info("Thread for collection " + collectionId + " starts.");
runHarvest();
}
private void runHarvest()
{
Context context;
Collection dso;
HarvestedCollection hc = null;
try {
context = new Context();
dso = collectionService.find(context, collectionId);
hc = harvestedCollectionService.find(context, dso);
try {
dso = hc.getCollection();
OAIHarvester harvester = new OAIHarvester(context, dso, hc);
harvester.runHarvest();
} catch (RuntimeException e) {
log.error("Runtime exception in thread: " + this.toString());
log.error(e.getMessage() + " " + e.getCause());
hc.setHarvestMessage("Runtime error occured while generating an OAI response");
hc.setHarvestStatus(HarvestedCollection.STATUS_UNKNOWN_ERROR);
} catch (Exception ex) {
log.error("General exception in thread: " + this.toString());
log.error(ex.getMessage() + " " + ex.getCause());
hc.setHarvestMessage("Error occured while generating an OAI response");
hc.setHarvestStatus(HarvestedCollection.STATUS_UNKNOWN_ERROR);
} finally {
try {
harvestedCollectionService.update(context, hc);
context.restoreAuthSystemState();
context.complete();
} catch (RuntimeException e) {
log.error("Unexpected exception while recovering from a harvesting error: " + e.getMessage(), e);
context.abort();
} catch (Exception e) {
log.error("Unexpected exception while recovering from a harvesting error: " + e.getMessage(), e);
context.abort();
}
synchronized (HarvestScheduler.class) {
HarvestScheduler.activeThreads--;
}
}
} catch (SQLException e) {
log.error(e.getMessage(), e);
}
log.info("Thread for collection " + hc.getCollection().getID() + " completes.");
}
}