package net.sourceforge.seqware.webservice.resources.tables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.Formatter; import java.util.List; import java.util.Map; import java.util.Set; import net.sourceforge.seqware.common.business.ValidationReportService; import net.sourceforge.seqware.common.business.impl.ValidationReportServiceImpl.ReportEntry; import net.sourceforge.seqware.common.factory.BeanFactory; import org.restlet.representation.Representation; import org.restlet.representation.StringRepresentation; import org.restlet.resource.Get; /** * <p> * FileLinkReportResource class. * </p> * * @author morgantaschuk * @version $Id: $Id */ public class FileLinkReportResource extends DatabaseResource { private List<Integer> swas = Lists.newArrayList(); /** * <p> * Constructor for FileLinkReportResource. * </p> */ public FileLinkReportResource() { super("fileLinkReportResource"); } /** {@inheritDoc} */ @Override public void doInit() { String swasString = (String) getRequestAttributes().get("swas"); if (swasString != null) { String[] swaArray = swasString.split(","); for (String swa : swaArray) { swas.add(Integer.valueOf(swa)); } } } /** * <p> * validate. * </p> * * @return a {@link org.restlet.representation.Representation} object. */ @Get("text") public Representation validate() { List<ReportEntry> report; ValidationReportService fileValidationService = BeanFactory.getFileValidationServiceBean(); if (swas.isEmpty()) { report = fileValidationService.fileLinkReport(); } else { report = fileValidationService.fileLinkReport(swas); } return new StringRepresentation(formatReport(report).toString()); } /** * Generates a formatting string to give each table column just enough space. * * @param report * The table to be displayed. * @return A formatting string. For example: %1$11s %2$19s %3$17s %4$11s %n */ private String getReportFormat(List<Map<String, String>> report) { Map<String, Integer> header = Maps.newLinkedHashMap(); for (Map<String, String> item : report) { for (Map.Entry<String, String> entry : item.entrySet()) { if (header.containsKey(entry.getKey())) { if (entry.getValue().length() > header.get(entry.getKey())) { header.put(entry.getKey(), entry.getValue().length()); } } else { header.put(entry.getKey(), entry.getValue().length()); } } } StringBuilder sb = new StringBuilder(); int index = 1; for (Map.Entry<String, Integer> entry : header.entrySet()) { sb.append("%").append(index++).append("$").append(entry.getValue()).append("s "); } sb.append("%n"); return sb.toString(); } private StringBuilder formatReport(List<ReportEntry> report) { List<Map<String, String>> reportHash = populateReportHash(report); String format = getReportFormat(reportHash); StringBuilder sb = new StringBuilder(); Formatter formatter = new Formatter(sb); for (Map<String, String> item : reportHash) { formatter.format(format, item.values().toArray()); } return sb; } private List<Map<String, String>> populateReportHash(List<ReportEntry> report) { List<Map<String, String>> result = Lists.newArrayList(); result.add(getHeader()); for (ReportEntry entry : report) { Map<String, String> item = Maps.newLinkedHashMap(); result.add(item); int numLinks = entry.getSequencerRunSwas().size() + entry.getLaneSwas().size() + entry.getIusSwas().size() + entry.getSampleSwas().size() + entry.getExperimentSwas().size() + entry.getStudySwas().size(); item.put("total_links", Integer.toString(numLinks)); item.put("#SRL", Integer.toString(entry.getSequencerRunSwas().size())); item.put("SequencerRunSWAs", listify(entry.getSequencerRunSwas())); item.put("#LL", Integer.toString(entry.getLaneSwas().size())); item.put("LaneSWAs", listify(entry.getLaneSwas())); item.put("#IL", Integer.toString(entry.getIusSwas().size())); item.put("IusSWAs", listify(entry.getIusSwas())); item.put("#SaL", Integer.toString(entry.getSampleSwas().size())); item.put("SampleSWAs", listify(entry.getSampleSwas())); item.put("#EL", Integer.toString(entry.getExperimentSwas().size())); item.put("ExperimentSWAs", listify(entry.getExperimentSwas())); item.put("#StL", Integer.toString(entry.getStudySwas().size())); item.put("StudySWAs", listify(entry.getStudySwas())); item.put("file_SWA", entry.getFileSwa()); item.put("file_name", entry.getFilename()); } return result; } private Map<String, String> getHeader() { Map<String, String> header = Maps.newLinkedHashMap(); header.put("total_links", "total_links"); header.put("#SRL", "#SRL"); header.put("SequencerRunSWAs", "SequencerRunSWAs"); header.put("#LL", "#LL"); header.put("LaneSWAs", "LaneSWAs"); header.put("#IL", "#IL"); header.put("IusSWAs", "IusSWAs"); header.put("#SaL", "#SaL"); header.put("SampleSWAs", "SampleSWAs"); header.put("#EL", "#EL"); header.put("ExperimentSWAs", "ExperimentSWAs"); header.put("#StL", "#StL"); header.put("StudySWAs", "StudySWAs"); header.put("file_SWA", "file_SWA"); header.put("file_name", "file_name"); return header; } private String listify(Set<String> collection) { StringBuilder sb = new StringBuilder(); for (String item : collection) { sb.append(item); sb.append(','); } if (sb.length() > 0) { sb.setLength(sb.length() - 1); } return sb.toString(); } }