use of uk.ac.bbsrc.tgac.miso.core.data.qc.QC in project miso-lims by miso-lims.
the class DefaultQualityControlService method startBulkOperation.
private BulkQcSaveOperation startBulkOperation(List<QC> items, ThrowingFunction<QC, QC, IOException> action) throws IOException {
QcTarget qcTarget = qcTypeService.get(items.get(0).getType().getId()).getQcTarget();
BulkQcSaveOperation operation = new BulkQcSaveOperation(qcTarget, items, authorizationManager.getCurrentUser());
// Authentication is tied to the thread, so use this same auth in the new thread
Authentication auth = SecurityContextHolder.getContextHolderStrategy().getContext().getAuthentication();
Thread thread = new Thread(() -> {
SecurityContextHolder.getContextHolderStrategy().getContext().setAuthentication(auth);
try {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
while (operation.hasMore()) {
try {
QC item = operation.getNextItem();
QC saved = action.apply(item);
operation.addSuccess(saved.getId());
} catch (ValidationException e) {
operation.addFailure(e);
status.setRollbackOnly();
} catch (Exception e) {
operation.setFailed(e);
status.setRollbackOnly();
}
}
}
});
} catch (Exception e) {
// Exception during transaction commit
operation.setFailed(e);
}
if (operation.isFailed()) {
Exception exception = operation.getException();
if (!(exception instanceof BulkValidationException)) {
LoggerFactory.getLogger(DefaultQualityControlService.class).error("Bulk save failed", exception);
}
}
operation.setComplete();
});
thread.start();
return operation;
}
use of uk.ac.bbsrc.tgac.miso.core.data.qc.QC in project miso-lims by miso-lims.
the class Dtos method to.
public static QC to(@Nonnull QcDto dto) {
QC to;
switch(dto.getQcTarget()) {
case "Library":
LibraryQC newLibraryQc = new LibraryQC();
Library ownerLibrary = new LibraryImpl();
ownerLibrary.setId(dto.getEntityId());
newLibraryQc.setLibrary(ownerLibrary);
to = newLibraryQc;
break;
case "Sample":
SampleQC newSampleQc = new SampleQC();
Sample ownerSample = new SampleImpl();
ownerSample.setId(dto.getEntityId());
newSampleQc.setSample(ownerSample);
to = newSampleQc;
break;
case "Pool":
PoolQC newPoolQc = new PoolQC();
Pool ownerPool = new PoolImpl();
ownerPool.setId(dto.getEntityId());
newPoolQc.setPool(ownerPool);
to = newPoolQc;
break;
case "Container":
ContainerQC newContainerQc = new ContainerQC();
SequencerPartitionContainer ownerContainer = new SequencerPartitionContainerImpl();
ownerContainer.setId(dto.getEntityId());
newContainerQc.setContainer(ownerContainer);
to = newContainerQc;
break;
case "Requisition":
RequisitionQC newRequisitionQc = new RequisitionQC();
Requisition ownerRequisition = new Requisition();
ownerRequisition.setId(dto.getEntityId());
newRequisitionQc.setRequisition(ownerRequisition);
to = newRequisitionQc;
break;
default:
throw new IllegalArgumentException("No such QC target: " + dto.getQcTarget());
}
if (dto.getId() != null) {
to.setId(dto.getId());
}
to.setDate(parseDate(dto.getDate()));
setBigDecimal(to::setResults, dto.getResults());
setObject(to::setType, QcType::new, dto.getQcTypeId());
to.setDescription(dto.getDescription());
setObject(to::setInstrument, InstrumentImpl::new, dto.getInstrumentId());
setObject(to::setKit, KitDescriptor::new, dto.getKitDescriptorId());
setString(to::setKitLot, dto.getKitLot());
addQcControlRuns(dto.getControls(), to, QcTarget.valueOf(dto.getQcTarget()));
return to;
}
use of uk.ac.bbsrc.tgac.miso.core.data.qc.QC in project miso-lims by miso-lims.
the class AsyncOperationManager method startAsyncBulkQcUpdate.
public <T, R extends Identifiable> ObjectNode startAsyncBulkQcUpdate(List<QcDto> dtos) throws IOException {
final QcTarget qcTarget = getQcTarget(dtos.get(0).getQcTarget());
List<QC> items = validateBulkUpdate("QC", dtos, Dtos::to, id -> qualityControlService.get(qcTarget, id));
BulkSaveOperation<QC> operation = qualityControlService.startBulkUpdate(items);
String uuid = addAsyncOperation(operation);
return makeRunningProgress(uuid, operation);
}
use of uk.ac.bbsrc.tgac.miso.core.data.qc.QC in project miso-lims by miso-lims.
the class DefaultQualityControlService method saveControlRuns.
private void saveControlRuns(long savedId, QC from, QcTargetStore handler) throws IOException {
QC to = get(from.getEntity().getQcTarget(), from.getId());
List<QcControlRun> toDelete = new ArrayList<>();
for (QcControlRun toControl : to.getControls()) {
if (!toControl.isSaved()) {
// newly created QC
continue;
}
QcControlRun fromControl = from.getControls().stream().filter(fc -> fc.getId() == toControl.getId()).findFirst().orElse(null);
if (fromControl == null) {
toDelete.add(toControl);
} else {
toControl.setControl(fromControl.getControl());
toControl.setLot(fromControl.getLot());
toControl.setQcPassed(fromControl.isQcPassed());
handler.updateControlRun(toControl);
}
}
for (QcControlRun control : toDelete) {
handler.deleteControlRun(control);
}
for (QcControlRun fromControl : from.getControls()) {
if (!fromControl.isSaved()) {
switch(to.getType().getQcTarget()) {
case Container:
((ContainerQcControlRun) fromControl).setQc((ContainerQC) to);
break;
case Library:
((LibraryQcControlRun) fromControl).setQc((LibraryQC) to);
break;
case Pool:
((PoolQcControlRun) fromControl).setQc((PoolQC) to);
break;
case Sample:
((SampleQcControlRun) fromControl).setQc((SampleQC) to);
break;
default:
throw new IllegalArgumentException("Unhandled QC target: " + to.getType().getQcTarget());
}
handler.createControlRun(fromControl);
}
}
}
use of uk.ac.bbsrc.tgac.miso.core.data.qc.QC in project miso-lims by miso-lims.
the class DefaultQualityControlService method update.
@Override
public QC update(QC qc) throws IOException {
loadChildEntities(qc);
QcTargetStore handler = getHandler(qc.getType().getQcTarget());
QualityControlEntity entity = handler.getEntity(qc.getEntity().getId());
User user = authorizationManager.getCurrentUser();
QC managed = handler.get(qc.getId());
if (managed.getType().getId() != qc.getType().getId()) {
throw new IllegalArgumentException("QC type has changed");
}
validateChange(qc, managed);
applyChanges(managed, qc);
entity.setChangeDetails(user);
changeLoggableStore.update(entity);
handler.save(managed);
saveControlRuns(managed.getId(), qc, handler);
return managed;
}
Aggregations