package net.sourceforge.seqware.common.business.impl;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import java.util.List;
import java.util.Set;
import net.sourceforge.seqware.common.business.ValidationReportService;
import net.sourceforge.seqware.common.dao.FileDAO;
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.Sample;
import net.sourceforge.seqware.common.model.SequencerRun;
import net.sourceforge.seqware.common.model.Study;
import net.sourceforge.seqware.common.model.Workflow;
import net.sourceforge.seqware.common.model.WorkflowRun;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
/**
* <p>ValidationReportServiceImpl class.</p>
*
* @author boconnor
* @version $Id: $Id
*/
public class ValidationReportServiceImpl implements ValidationReportService {
@Autowired
private FileDAO fileDao;
/** {@inheritDoc} */
@Override
public List<ReportEntry> fileLinkReport() {
List<File> files = fileDao.list();
List<Integer> fileSwas = Lists.newArrayList();
for (File file : files) {
fileSwas.add(file.getSwAccession());
}
return fileLinkReport(fileSwas);
}
private void visitProcessing(Processing processing, int in, StringBuilder sb) {
sb.append(indent(in)).append(processing.getAlgorithm()).append(" SWA: ").append(processing.getSwAccession());
sb.append("\n");
visitSequencerRun(processing, in, sb);
visitLane(processing, in, sb);
visitIus(processing, in, sb);
visitSample(processing, in, sb);
visitExperiment(processing, in, sb);
visitStudy(processing, in, sb);
if (visitWorkflowRun(processing, in, sb)) {
in++;
}
for (Processing parent : processing.getParents()) {
visitProcessing(parent, in, sb);
}
}
private void visitSequencerRun(Processing processing, int in, StringBuilder sb) {
for (SequencerRun link : processing.getSequencerRuns()) {
sb.append(indent(in++)).append("LINK SequencerRun SWA: ").append(link.getSwAccession());
sb.append('\n');
}
}
private void visitLane(Processing processing, int in, StringBuilder sb) {
for (Lane link : processing.getLanes()) {
sb.append(indent(++in)).append("LINK Lane SWA: ").append(link.getSwAccession());
sb.append('\n');
}
}
private void visitIus(Processing processing, int in, StringBuilder sb) {
for (IUS link : processing.getIUS()) {
sb.append(indent(++in)).append("LINK IUS SWA: ").append(link.getSwAccession());
sb.append('\n');
}
}
private void visitSample(Processing processing, int in, StringBuilder sb) {
for (Sample link : processing.getSamples()) {
sb.append(indent(in++)).append("LINK Sample SWA: ").append(link.getSwAccession());
sb.append('\n');
}
}
private void visitExperiment(Processing processing, int in, StringBuilder sb) {
for (Experiment link : processing.getExperiments()) {
sb.append(indent(in++)).append("LINK Experiment SWA: ").append(link.getSwAccession());
sb.append('\n');
}
}
private void visitStudy(Processing processing, int in, StringBuilder sb) {
for (Study link : processing.getStudies()) {
sb.append(indent(in++)).append("LINK Study SWA: ").append(link.getSwAccession());
sb.append('\n');
}
}
private boolean visitWorkflowRun(Processing processing, int in, StringBuilder sb) {
boolean result = false;
WorkflowRun workflowRun = processing.getWorkflowRun();
if (workflowRun != null) {
Workflow workflow = workflowRun.getWorkflow();
if (workflow != null) {
sb.append(indent(in++)).append("WORKFLOW ").append(workflow.getFullName()).append(" SWA: ").append(workflow.getSwAccession());
sb.append('\n');
result = true;
}
}
return result;
}
/**
* {@inheritDoc}
*
* @param swa
*/
@Override
public String fileReverseHierarchyDisplay(Integer swa) {
checkNotNull(swa);
StringBuilder sb = new StringBuilder();
int in = 0;
File file = fileDao.findBySWAccession(swa);
sb.append(indent(in++)).append("FILE SWA: ").append(file.getSwAccession()).append(" FILE NAME: ").append(file.getFileName()).append(" Processing Children: ").append(file.getProcessings().size());
sb.append("\n");
for (Processing process : file.getProcessings()) {
visitProcessing(process, in, sb);
}
return sb.toString();
}
private String indent(int indentSize) {
StringBuilder sb = new StringBuilder();
sb.append("");
for (int i = 0; i < indentSize; i++) {
sb.append(" ");
}
return sb.toString();
}
/** {@inheritDoc} */
@Override
public List<ReportEntry> fileLinkReport(List<Integer> fileSwas) {
List<ReportEntry> result = Lists.newArrayList();
for (Integer swa : fileSwas) {
ReportEntry entry = new ReportEntry();
result.add(entry);
entry.setFileSwa(swa.toString());
File file = fileDao.findBySWAccession(swa);
entry.setFilename(file.getFileName());
for (Processing process : file.getProcessings()) {
walkProcessing(process, entry);
}
}
return result;
}
private void walkProcessing(Processing processing, ReportEntry entry) {
entry.setRootProcessingName(processing.getAlgorithm());
entry.setRootProcessingSwa(processing.getSwAccession().toString());
walkSequencerRun(processing, entry);
walkLane(processing, entry);
walkIus(processing, entry);
walkSample(processing, entry);
walkExperiment(processing, entry);
walkStudy(processing, entry);
for (Processing parent : processing.getParents()) {
walkProcessing(parent, entry);
}
}
private void walkSequencerRun(Processing processing, ReportEntry entry) {
for (SequencerRun link : processing.getSequencerRuns()) {
entry.getSequencerRunSwas().add(link.getSwAccession().toString());
}
}
private void walkLane(Processing processing, ReportEntry entry) {
for (Lane link : processing.getLanes()) {
entry.getLaneSwas().add(link.getSwAccession().toString());
}
}
private void walkIus(Processing processing, ReportEntry entry) {
for (IUS link : processing.getIUS()) {
entry.getIusSwas().add(link.getSwAccession().toString());
}
}
private void walkSample(Processing processing, ReportEntry entry) {
for (Sample link : processing.getSamples()) {
entry.getSampleSwas().add(link.getSwAccession().toString());
}
}
private void walkExperiment(Processing processing, ReportEntry entry) {
for (Experiment link : processing.getExperiments()) {
entry.getExperimentSwas().add(link.getSwAccession().toString());
}
}
private void walkStudy(Processing processing, ReportEntry entry) {
for (Study link : processing.getStudies()) {
entry.getStudySwas().add(link.getSwAccession().toString());
}
}
public class ReportEntry {
private String filename;
private String fileSwa;
private String rootProcessingName;
private String rootProcessingSwa;
private Set<String> sequencerRunSwas = Sets.newHashSet();
private Set<String> laneSwas = Sets.newHashSet();
private Set<String> iusSwas = Sets.newHashSet();
private Set<String> sampleSwas = Sets.newHashSet();
private Set<String> experimentSwas = Sets.newHashSet();
private Set<String> studySwas = Sets.newHashSet();
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getFileSwa() {
return fileSwa;
}
public void setFileSwa(String fileSwa) {
this.fileSwa = fileSwa;
}
public String getRootProcessingName() {
return rootProcessingName;
}
public void setRootProcessingName(String rootProcessingName) {
this.rootProcessingName = rootProcessingName;
}
public String getRootProcessingSwa() {
return rootProcessingSwa;
}
public void setRootProcessingSwa(String rootProcessingSwa) {
this.rootProcessingSwa = rootProcessingSwa;
}
public Set<String> getSequencerRunSwas() {
return sequencerRunSwas;
}
public void setSequencerRunSwas(Set<String> sequencerRunSwas) {
this.sequencerRunSwas = sequencerRunSwas;
}
public Set<String> getLaneSwas() {
return laneSwas;
}
public void setLaneSwas(Set<String> laneSwas) {
this.laneSwas = laneSwas;
}
public Set<String> getIusSwas() {
return iusSwas;
}
public void setIusSwas(Set<String> iusSwas) {
this.iusSwas = iusSwas;
}
public Set<String> getSampleSwas() {
return sampleSwas;
}
public void setSampleSwas(Set<String> sampleSwas) {
this.sampleSwas = sampleSwas;
}
public Set<String> getExperimentSwas() {
return experimentSwas;
}
public void setExperimentSwas(Set<String> experimentSwas) {
this.experimentSwas = experimentSwas;
}
public Set<String> getStudySwas() {
return studySwas;
}
public void setStudySwas(Set<String> studySwas) {
this.studySwas = studySwas;
}
}
}