package net.sourceforge.seqware.common.business.impl;
import io.seqware.common.model.ProcessingStatus;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import net.sourceforge.seqware.common.business.ProcessingService;
import net.sourceforge.seqware.common.dao.FileDAO;
import net.sourceforge.seqware.common.dao.ProcessingDAO;
import net.sourceforge.seqware.common.model.Experiment;
import net.sourceforge.seqware.common.model.File;
import net.sourceforge.seqware.common.model.IUS;
import net.sourceforge.seqware.common.model.Lane;
import net.sourceforge.seqware.common.model.Processing;
import net.sourceforge.seqware.common.model.Registration;
import net.sourceforge.seqware.common.model.Sample;
import net.sourceforge.seqware.common.model.SequencerRun;
import net.sourceforge.seqware.common.model.Study;
import net.sourceforge.seqware.common.model.WorkflowRun;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* <p>
* ProcessingServiceImpl class.
* </p>
*
* @author boconnor
* @version $Id: $Id
*/
public class ProcessingServiceImpl implements ProcessingService {
private ProcessingDAO processingDAO = null;
private FileDAO fileDAO = null;
private static final Log LOG = LogFactory.getLog(ProcessingServiceImpl.class);
/**
* <p>
* Constructor for ProcessingServiceImpl.
* </p>
*/
public ProcessingServiceImpl() {
super();
}
/**
* {@inheritDoc}
*
* Sets a private member variable with an instance of an implementation of ProcessingDAO. This method is called by the Spring framework
* at run time.
*
* @see ProcessingDAO
*/
@Override
public void setProcessingDAO(ProcessingDAO processingDAO) {
this.processingDAO = processingDAO;
}
/**
* Sets a private member variable with an instance of an implementation of FileDAO. This method is called by the Spring framework at run
* time.
*
* @param fileDAO
* implementation of FileDAO
* @see FileDAO
*/
public void setFileDAO(FileDAO fileDAO) {
this.fileDAO = fileDAO;
}
/**
* {@inheritDoc}
*
* Inserts an instance of Processing into the database.
*/
@Override
public void insert(SequencerRun sequencerRun, Processing processing) {
if (processing.getStatus() == null) {
processing.setStatus(ProcessingStatus.pending);
}
// processing.setExperimentId(experiment.getExperimentId());
processing.setCreateTimestamp(new Date());
processingDAO.insert(processing);
}
/** {@inheritDoc} */
@Override
public void insert(Registration registration, SequencerRun sequencerRun, Processing processing) {
if (processing.getStatus() == null) {
processing.setStatus(ProcessingStatus.pending);
}
// processing.setExperimentId(experiment.getExperimentId());
processing.setCreateTimestamp(new Date());
processingDAO.insert(registration, processing);
}
/** {@inheritDoc} */
@Override
public Integer insert(Processing processing) {
if (processing.getStatus() == null) {
processing.setStatus(ProcessingStatus.pending);
}
// processing.setExperimentId(experiment.getExperimentId());
processing.setCreateTimestamp(new Date());
return processingDAO.insert(processing);
}
/**
* {@inheritDoc}
*
* Updates an instance of Processing in the database.
*/
@Override
public void update(Processing processing) {
processingDAO.update(processing);
}
/**
* {@inheritDoc}
*
* @param processing
* @param deleteRealFiles
*/
@Override
public void delete(Processing processing, boolean deleteRealFiles) {
List<File> deleteFiles = null;
if (deleteRealFiles) {
deleteFiles = processingDAO.getFiles(processing.getProcessingId());
}
Set<Study> studies = processing.getStudies();
for (Study study : studies) {
study.getProcessings().remove(processing);
}
Set<Experiment> experiments = processing.getExperiments();
for (Experiment experiment : experiments) {
experiment.getProcessings().remove(processing);
}
Set<Sample> samples = processing.getSamples();
for (Sample sample : samples) {
sample.getProcessings().remove(processing);
}
Set<SequencerRun> sequencerRuns = processing.getSequencerRuns();
for (SequencerRun sequencerRun : sequencerRuns) {
sequencerRun.getProcessings().remove(processing);
}
Set<Lane> lanes = processing.getLanes();
for (Lane lane : lanes) {
lane.getProcessings().remove(processing);
}
Set<IUS> iuses = processing.getIUS();
for (IUS ius : iuses) {
ius.getProcessings().remove(processing);
}
Set<Processing> parents = processing.getParents();
for (Processing parent : parents) {
parent.getChildren().remove(processing);
}
Set<Processing> children = processing.getChildren();
for (Processing child : children) {
child.getParents().remove(processing);
}
processingDAO.delete(processing);
if (deleteRealFiles) {
fileDAO.deleteAllWithFolderStore(deleteFiles);
}
}
/** {@inheritDoc} */
@Override
public List<File> getFiles(Integer processingId) {
return processingDAO.getFiles(processingId);
}
/** {@inheritDoc} */
@Override
public boolean isHasFile(Integer processingId) {
return processingDAO.isHasFile(processingId);
}
/** {@inheritDoc} */
@Override
public Set<Processing> setWithHasFile(Set<Processing> list) {
for (Processing processing : list) {
boolean isHasFile = isHasFile(processing.getProcessingId());
processing.setIsHasFile(isHasFile);
if (processing.getWorkflowRun() != null) {
processing.getWorkflowRun().setIsHasFile(isHasFile);
}
}
return list;
}
/** {@inheritDoc} */
@Override
public List<File> getFiles(Integer processingId, String metaType) {
return processingDAO.getFiles(processingId, metaType);
}
/**
* <p>
* isHasFile.
* </p>
*
* @param processingId
* a {@link java.lang.Integer} object.
* @param metaType
* a {@link java.lang.String} object.
* @return a boolean.
*/
public boolean isHasFile(Integer processingId, String metaType) {
return processingDAO.isHasFile(processingId, metaType);
}
/** {@inheritDoc} */
@Override
public Set<Processing> setWithHasFile(Set<Processing> list, String metaType) {
Set<Processing> result = new TreeSet<>();
for (Processing processing : list) {
boolean isHasFile = isHasFile(processing.getProcessingId(), metaType);
if (isHasFile) {
processing.setIsHasFile(isHasFile);
if (processing.getWorkflowRun() != null) {
processing.getWorkflowRun().setIsHasFile(isHasFile);
}
result.add(processing);
}
}
return result;
}
/**
* {@inheritDoc}
*
* @param id
*/
@Override
public Processing findByID(Integer id) {
Processing processing = null;
if (id != null) {
try {
processing = processingDAO.findByID(id);
} catch (Exception exception) {
LOG.error("Cannot find Processing by ID " + id);
LOG.error(exception.getMessage());
}
}
return processing;
}
/** {@inheritDoc} */
@Override
public Processing findByIDOnlyWithRunningWR(Integer processingID) {
Processing processing = findByID(processingID);
/*
* Set<Processing> all = processing.getChildren(); Set<Processing> res = new TreeSet<Processing>();
*
* // get processing with workflow run has not status equal completed for (Processing pr : all) { WorkflowRun workflowRun =
* pr.getWorkflowRun(); if(workflowRun == null || !workflowRun.getStatus().equals("completed")){ res.add(pr); } }
*
* processing.setChildren(res);
*/
return processing;
}
/** {@inheritDoc} */
@Override
public Processing findBySWAccession(Integer swAccession) {
Processing processing = null;
if (swAccession != null) {
try {
processing = processingDAO.findBySWAccession(swAccession);
} catch (Exception exception) {
LOG.error("Cannot find Processing by swAccession " + swAccession);
LOG.error(exception.getMessage());
}
}
return processing;
}
/** {@inheritDoc} */
@Override
public List<Processing> findByOwnerID(Integer registrationId) {
List<Processing> processings = null;
if (registrationId != null) {
try {
processings = processingDAO.findByOwnerID(registrationId);
} catch (Exception exception) {
LOG.error("Cannot find Processings by registrationId " + registrationId);
LOG.error(exception.getMessage());
}
}
return processings;
}
/** {@inheritDoc} */
@Override
public List<Processing> findByCriteria(String criteria, boolean isCaseSens) {
return processingDAO.findByCriteria(criteria, isCaseSens);
}
/** {@inheritDoc} */
@Override
public Processing updateDetached(Processing processing) {
return processingDAO.updateDetached(processing);
}
/** {@inheritDoc} */
@Override
public List<Processing> list() {
return processingDAO.list();
}
/** {@inheritDoc} */
@Override
public void update(Registration registration, Processing processing) {
processingDAO.update(registration, processing);
}
/** {@inheritDoc} */
@Override
public Integer insert(Registration registration, Processing processing) {
if (processing.getStatus() == null) {
processing.setStatus(ProcessingStatus.pending);
}
processing.setCreateTimestamp(new Date());
return processingDAO.insert(registration, processing);
}
/** {@inheritDoc} */
@Override
public Processing updateDetached(Registration registration, Processing processing) {
return processingDAO.updateDetached(registration, processing);
}
/**
* {@inheritDoc}
*
* Returns the Set of the Processings belongs to the specific Sample, WorkflowRun.
*/
@Override
public Set<Processing> findFor(Sample sample, WorkflowRun workflowRun) {
Set<Processing> processings = new HashSet<>();
if (sample.getProcessings() != null) {
processings.addAll(sample.getProcessings());
for (Processing proc : sample.getProcessings()) {
addNestedProcessings(processings, proc);
}
}
for (IUS ius : sample.getIUS()) {
processings.addAll(ius.getProcessings());
for (Processing proc : ius.getProcessings()) {
addNestedProcessings(processings, proc);
}
}
// Remove processings doesn't belong to the workflow run.
if (workflowRun != null) {
Iterator<Processing> processingIter = processings.iterator();
while (processingIter.hasNext()) {
Processing currProcessing = processingIter.next();
if (!workflowRun.equals(currProcessing.getWorkflowRun())) {
processingIter.remove();
}
}
}
return processings;
}
private void addNestedProcessings(Set<Processing> processings, Processing processing) {
if (processing.getChildren() != null) {
Set<Processing> childrenProcessings = processing.getChildren();
for (Processing child : childrenProcessings) {
addNestedProcessings(processings, child);
}
processings.addAll(childrenProcessings);
}
}
/** {@inheritDoc} */
@Override
public Set<Processing> findFor(Sample sample) {
return findFor(sample, null);
}
}
// ex:sw=4:ts=4: