use of ca.corefacility.bioinformatics.irida.model.sequenceFile.SequenceFile in project irida by phac-nml.
the class RESTSampleSequenceFilesController method addNewSequenceFileToSample.
/**
* Add a new {@link SequenceFile} to a {@link Sample}.
*
* @param sampleId
* the identifier for the {@link Sample}.
* @param file
* the content of the {@link SequenceFile}.
* @param fileResource
* the parameters for the file
* @param response
* the servlet response.
* @return a response indicating the success of the submission.
* @throws IOException
* if we can't write the file to disk.
*/
@RequestMapping(value = "/api/samples/{sampleId}/sequenceFiles", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ModelMap addNewSequenceFileToSample(@PathVariable Long sampleId, @RequestPart("file") MultipartFile file, @RequestPart(value = "parameters", required = false) SequenceFileResource fileResource, HttpServletResponse response) throws IOException {
ModelMap modelMap = new ModelMap();
logger.debug("Adding sequence file to sample " + sampleId);
logger.trace("Uploaded file size: " + file.getSize() + " bytes");
// load the sample from the database
Sample sample = sampleService.read(sampleId);
logger.trace("Read sample " + sampleId);
// prepare a new sequence file using the multipart file supplied by the
// caller
Path temp = Files.createTempDirectory(null);
Path target = temp.resolve(file.getOriginalFilename());
// Changed to MultipartFile.transerTo(File) because it was truncating
// large files to 1039956336 bytes
// target = Files.write(target, file.getBytes());
file.transferTo(target.toFile());
logger.trace("Wrote temp file to " + target);
SequenceFile sf;
SequencingRun miseqRun = null;
if (fileResource != null) {
sf = fileResource.getResource();
Long miseqRunId = fileResource.getMiseqRunId();
if (miseqRunId != null) {
miseqRun = miseqRunService.read(miseqRunId);
logger.trace("Read miseq run " + miseqRunId);
}
} else {
sf = new SequenceFile();
}
sf.setFile(target);
SingleEndSequenceFile singleEndSequenceFile = new SingleEndSequenceFile(sf);
if (miseqRun != null) {
singleEndSequenceFile.setSequencingRun(miseqRun);
logger.trace("Added seqfile to miseqrun");
}
// save the seqobject and sample
SampleSequencingObjectJoin createSequencingObjectInSample = sequencingObjectService.createSequencingObjectInSample(singleEndSequenceFile, sample);
singleEndSequenceFile = (SingleEndSequenceFile) createSequencingObjectInSample.getObject();
logger.trace("Created seqfile in sample " + createSequencingObjectInSample.getObject().getId());
// clean up the temporary files.
Files.deleteIfExists(target);
Files.deleteIfExists(temp);
logger.trace("Deleted temp file");
// prepare a link to the sequence file itself (on the sequence file
// controller)
String objectType = objectLabels.get(SingleEndSequenceFile.class);
Long sequenceFileId = singleEndSequenceFile.getSequenceFile().getId();
Link selfRel = linkTo(methodOn(RESTSampleSequenceFilesController.class).readSequenceFileForSequencingObject(sampleId, objectType, singleEndSequenceFile.getId(), sequenceFileId)).withSelfRel();
// Changed, because sfr.setResource(sf)
// and sfr.setResource(sampleSequenceFileRelationship.getObject())
// both will not pass a GET-POST comparison integration test.
singleEndSequenceFile = (SingleEndSequenceFile) sequencingObjectService.read(singleEndSequenceFile.getId());
SequenceFile sequenceFile = singleEndSequenceFile.getFileWithId(sequenceFileId);
// add links to the resource
sequenceFile.add(linkTo(methodOn(RESTSampleSequenceFilesController.class).getSampleSequenceFiles(sampleId)).withRel(REL_SAMPLE_SEQUENCE_FILES));
sequenceFile.add(selfRel);
sequenceFile.add(linkTo(methodOn(RESTProjectSamplesController.class).getSample(sampleId)).withRel(REL_SAMPLE));
sequenceFile.add(linkTo(methodOn(RESTSampleSequenceFilesController.class).readSequencingObject(sampleId, objectType, singleEndSequenceFile.getId())).withRel(REL_SEQ_OBJECT));
modelMap.addAttribute(RESTGenericController.RESOURCE_NAME, sequenceFile);
// add a location header.
response.addHeader(HttpHeaders.LOCATION, selfRel.getHref());
// set the response status.
response.setStatus(HttpStatus.CREATED.value());
// respond to the client
return modelMap;
}
use of ca.corefacility.bioinformatics.irida.model.sequenceFile.SequenceFile in project irida by phac-nml.
the class RESTSampleSequenceFilesController method addNewSequenceFilePairToSample.
/**
* Add a pair of {@link SequenceFile}s to a {@link Sample}
*
* @param sampleId
* The {@link Sample} id to add to
* @param file1
* The first multipart file
* @param fileResource1
* The metadata for the first file
* @param file2
* The second multipart file
* @param fileResource2
* the metadata for the second file
* @param response
* a reference to the servlet response.
* @return Response containing the locations for the created files
* @throws IOException
* if we can't write the files to disk
*/
@RequestMapping(value = "/api/samples/{sampleId}/pairs", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ModelMap addNewSequenceFilePairToSample(@PathVariable Long sampleId, @RequestPart("file1") MultipartFile file1, @RequestPart(value = "parameters1") SequenceFileResource fileResource1, @RequestPart("file2") MultipartFile file2, @RequestPart(value = "parameters2") SequenceFileResource fileResource2, HttpServletResponse response) throws IOException {
logger.debug("Adding pair of sequence files to sample " + sampleId);
logger.trace("First uploaded file size: " + file1.getSize() + " bytes");
logger.trace("Second uploaded file size: " + file2.getSize() + " bytes");
ModelMap modelMap = new ModelMap();
// confirm that a relationship exists between the project and the sample
Sample sample = sampleService.read(sampleId);
logger.trace("Read sample " + sampleId);
// create temp files
Path temp1 = Files.createTempDirectory(null);
Path target1 = temp1.resolve(file1.getOriginalFilename());
Path temp2 = Files.createTempDirectory(null);
Path target2 = temp2.resolve(file2.getOriginalFilename());
// transfer the files to temp directories
file1.transferTo(target1.toFile());
file2.transferTo(target2.toFile());
// create the model objects
SequenceFile sf1 = fileResource1.getResource();
SequenceFile sf2 = fileResource2.getResource();
sf1.setFile(target1);
sf2.setFile(target2);
// get the sequencing run
SequencingRun sequencingRun = null;
if (!Objects.equal(fileResource1.getMiseqRunId(), fileResource2.getMiseqRunId())) {
throw new IllegalArgumentException("Cannot upload a pair of files from different sequencing runs");
}
Long runId = fileResource1.getMiseqRunId();
SequenceFilePair sequenceFilePair = new SequenceFilePair(sf1, sf2);
if (runId != null) {
sequencingRun = miseqRunService.read(runId);
sequenceFilePair.setSequencingRun(sequencingRun);
logger.trace("Added sequencing run to files" + runId);
}
// add the files and join
SampleSequencingObjectJoin createSequencingObjectInSample = sequencingObjectService.createSequencingObjectInSample(sequenceFilePair, sample);
// clean up the temporary files.
Files.deleteIfExists(target1);
Files.deleteIfExists(temp1);
Files.deleteIfExists(target2);
Files.deleteIfExists(temp2);
logger.trace("Deleted temp files");
SequencingObject sequencingObject = createSequencingObjectInSample.getObject();
sequencingObject = addSequencingObjectLinks(sequencingObject, sampleId);
sequencingObject.add(linkTo(methodOn(RESTSampleSequenceFilesController.class).getSampleSequenceFiles(sampleId)).withRel(REL_SAMPLE_SEQUENCE_FILES));
// add location header
response.addHeader(HttpHeaders.LOCATION, sequencingObject.getLink("self").getHref());
// set the response status.
response.setStatus(HttpStatus.CREATED.value());
modelMap.addAttribute(RESTGenericController.RESOURCE_NAME, sequencingObject);
// respond to the client
return modelMap;
}
use of ca.corefacility.bioinformatics.irida.model.sequenceFile.SequenceFile in project irida by phac-nml.
the class RESTSampleSequenceFilesController method addSequencingObjectLinks.
/**
* Add the links for a {@link SequencingObject} to its sample, self, to each
* individual {@link SequenceFile}
*
* @param sequencingObject {@link SequencingObject} to enhance
* @param sampleId ID of the {@link Sample} for the object
* @param <T> The subclass of {@link SequencingObject} being enhanced by this method
* @return the enhanced {@link SequencingObject}
*/
@SuppressWarnings("unchecked")
public static <T extends SequencingObject> T addSequencingObjectLinks(T sequencingObject, Long sampleId) {
String objectType = objectLabels.get(sequencingObject.getClass());
// link to self
sequencingObject.add(linkTo(methodOn(RESTSampleSequenceFilesController.class).readSequencingObject(sampleId, objectType, sequencingObject.getId())).withSelfRel());
// link to the sample
sequencingObject.add(linkTo(methodOn(RESTProjectSamplesController.class).getSample(sampleId)).withRel(RESTSampleSequenceFilesController.REL_SAMPLE));
// link to the individual files
for (SequenceFile file : sequencingObject.getFiles()) {
file.add(linkTo(methodOn(RESTSampleSequenceFilesController.class).readSequenceFileForSequencingObject(sampleId, objectType, sequencingObject.getId(), file.getId())).withSelfRel());
}
AnalysisSubmission automatedAssembly = sequencingObject.getAutomatedAssembly();
if (automatedAssembly != null) {
sequencingObject.add(linkTo(methodOn(RESTAnalysisSubmissionController.class).getResource(automatedAssembly.getId())).withRel(REL_AUTOMATED_ASSEMBLY));
}
AnalysisSubmission sistrTyping = sequencingObject.getSistrTyping();
if (sistrTyping != null) {
sequencingObject.add(linkTo(methodOn(RESTAnalysisSubmissionController.class).getResource(sistrTyping.getId())).withRel(REL_SISTR_TYPING));
}
// if it's a pair, add forward/reverse links
if (sequencingObject instanceof SequenceFilePair) {
sequencingObject = (T) addSequenceFilePairLinks((SequenceFilePair) sequencingObject, sampleId);
}
return sequencingObject;
}
use of ca.corefacility.bioinformatics.irida.model.sequenceFile.SequenceFile in project irida by phac-nml.
the class FastqView method renderMergedOutputModel.
/**
* {@inheritDoc}
*/
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
SequenceFile sfr = (SequenceFile) model.get(RESTGenericController.RESOURCE_NAME);
Path fileContent = sfr.getFile();
String filename = fileContent.getFileName().toString();
logger.trace("Sending file to client [" + filename + "]");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");
response.setHeader(HttpHeaders.CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(Files.size(fileContent)));
OutputStream os = response.getOutputStream();
Files.copy(fileContent, os);
os.flush();
os.close();
}
use of ca.corefacility.bioinformatics.irida.model.sequenceFile.SequenceFile in project irida by phac-nml.
the class ProjectEventHandlerTest method testHandleSequenceFileAddedEventMultipleProjects.
@SuppressWarnings("unchecked")
@Test
public void testHandleSequenceFileAddedEventMultipleProjects() {
Class<? extends ProjectEvent> clazz = DataAddedToSampleProjectEvent.class;
Project project = new Project("p1");
Project project2 = new Project("p2");
Sample sample = new Sample();
SequenceFile file = new SequenceFile();
SingleEndSequenceFile seqObj = new SingleEndSequenceFile(file);
SampleSequencingObjectJoin join = new SampleSequencingObjectJoin(sample, seqObj);
when(psjRepository.getProjectForSample(sample)).thenReturn(Lists.newArrayList(new ProjectSampleJoin(project, sample, true), new ProjectSampleJoin(project2, sample, true)));
when(eventRepository.save(any(ProjectEvent.class))).thenReturn(new DataAddedToSampleProjectEvent(project, sample));
Object[] args = {};
MethodEvent methodEvent = new MethodEvent(clazz, join, args);
handler.delegate(methodEvent);
ArgumentCaptor<ProjectEvent> captor = ArgumentCaptor.forClass(ProjectEvent.class);
verify(eventRepository, times(2)).save(captor.capture());
List<ProjectEvent> allValues = captor.getAllValues();
Set<Project> projects = Sets.newHashSet(project, project2);
for (ProjectEvent event : allValues) {
assertTrue(event instanceof DataAddedToSampleProjectEvent);
Project eventProject = event.getProject();
assertTrue(projects.contains(eventProject));
projects.remove(eventProject);
}
verify(projectRepository, times(2)).save(project);
}
Aggregations