@Override public Optional<DetailedSample> getEffectiveGroupIdSample() { for (DetailedSample sample = this; sample != null; sample = sample.getParent()) { String groupId = sample.getGroupId(); if (!LimsUtils.isStringEmptyOrNull(groupId)) return Optional.of(sample); } return Optional.empty(); }
if (sample.getParent() == null) { throw new IllegalArgumentException(ERR_MISSING_PARENT_ID); DetailedSample tempParent = sample.getParent(); if (tempParent.getId() != Sample.UNSAVED_ID) { Sample parent = sampleStore.getSample(tempParent.getId()); if (parent == null) throw new IllegalArgumentException("Parent sample does not exist"); return (DetailedSample) parent; } else { if (isTissueSample(tempParent) && isIdentitySample(tempParent.getParent())) { DetailedSample tissueParent = sampleStore.getMatchingGhostTissue((SampleTissue) tempParent); if (tissueParent != null) {
private static boolean safeCategoryCheck(Sample sample, String category) { DetailedSample detailedSample = (DetailedSample) sample; if (detailedSample.getSampleClass() == null) return false; return category.equals(detailedSample.getSampleClass().getSampleCategory()); }
private void setIdentity(DetailedSample descendant) throws IOException, MisoNamingException { if (descendant.getParent() == null) { throw new IllegalArgumentException(ERR_MISSING_PARENT_ID); } DetailedSample child = descendant; DetailedSample parent = descendant.getParent(); while (parent.getParent() != null) { child = parent; parent = child.getParent(); } if (!isIdentitySample(parent)) { throw new IllegalStateException("Missing Identity at root of hierarchy"); } if (descendant.getIdentityId() != null) { parent.setId(descendant.getIdentityId()); } SampleIdentity identity = findOrCreateIdentity(descendant, (SampleIdentity) parent); child.setParent(identity); }
private void validateHierarchy(DetailedSample sample) throws IOException { Set<SampleValidRelationship> sampleValidRelationships = sampleValidRelationshipService.getAll(); if (!isValidRelationship(sampleValidRelationships, sample.getParent(), sample)) { throw new IllegalArgumentException("Parent " + sample.getParent().getSampleClass().getAlias() + " not permitted to have a child of type " + sample.getSampleClass().getAlias()); } }
sample.setParent(parent); } else { DetailedSample parent = null; } else if (identityId != null) { parent = new SampleIdentityImpl(); parent.setId(identityId); sample.setParent(parent); sample.setId(sampleId); sample.setProject(project); sample.setSecurityProfile(securityProfile); sample.setAccession(accession); sample.setName(name); sample.setDescription(description); sample.setScientificName(scientificName); sample.setTaxonIdentifier(taxonIdentifier); sample.setSampleType(sampleType); sample.setReceivedDate(receivedDate); sample.setQcPassed(qcPassed); sample.setIdentificationBarcode(identificationBarcode); sample.setLocationBarcode(locationBarcode); sample.setAlias(alias); sample.setLastModifier(lastModifier); sample.setVolume(volume); sample.setVolumeUnits(volumeUnits); sample.setDiscarded(discarded); sample.getChangeLog().addAll(changeLog);
DetailedSample dTarget = (DetailedSample) target; DetailedSample dSource = (DetailedSample) source; dTarget.setArchived(dSource.getArchived()); dTarget.setGroupDescription(dSource.getGroupDescription()); dTarget.setGroupId(dSource.getGroupId()); dTarget.setCreationDate(dSource.getCreationDate()); dTarget.setDetailedQcStatus(dSource.getDetailedQcStatus()); dTarget.setDetailedQcStatusNote(nullifyStringIfBlank(dSource.getDetailedQcStatusNote())); dTarget.setQcPassed(dSource.getQcPassed()); dTarget.setSubproject(dSource.getSubproject()); if (isIdentitySample(target)) { applyIdentityChanges((SampleIdentity) target, (SampleIdentity) source);
DetailedQcStatus detailedQcStatus = new DetailedQcStatusImpl(); detailedQcStatus.setId(from.getDetailedQcStatusId()); to.setDetailedQcStatus(detailedQcStatus); to.setDetailedQcStatusNote(from.getDetailedQcStatusNote()); if (from.getSubprojectId() != null) { Subproject subproject = new SubprojectImpl(); subproject.setId(from.getSubprojectId()); to.setSubproject(subproject); to.setSampleClass(sampleClass); to.setGroupId(nullifyStringIfBlank(from.getGroupId())); to.setGroupDescription(nullifyStringIfBlank(from.getGroupDescription())); to.setSynthetic(from.getSynthetic()); if (from.getSubprojectId() != null) { Subproject subproject = new SubprojectImpl(); subproject.setId(from.getSubprojectId()); to.setSubproject(subproject); to.setCreationDate(LimsUtils.isStringEmptyOrNull(from.getCreationDate()) ? null : parseDate(from.getCreationDate())); if (from.getIdentityId() != null) { to.setIdentityId(from.getIdentityId()); to.setNonStandardAlias(from.getNonStandardAlias()); to.setParent(getParent(from)); if (!LimsUtils.isStringEmptyOrNull(from.getExternalNames()) && to.getParent() != null) { SampleIdentity identity = LimsUtils.getParent(SampleIdentity.class, to); if (identity == null) {
dto.setSampleClassId(from.getSampleClass().getId()); if (from.getDetailedQcStatus() != null) { dto.setDetailedQcStatusId(from.getDetailedQcStatus().getId()); if (from.getSubproject() != null) { dto.setSubprojectId(from.getSubproject().getId()); dto.setSubprojectAlias(from.getSubproject().getAlias()); dto.setSubprojectPriority(from.getSubproject().getPriority()); if (from.getParent() != null) { dto.setParentId(from.getParent().getId()); dto.setParentAlias(from.getParent().getAlias()); dto.setParentTissueSampleClassId(from.getParent().getSampleClass().getId()); dto.setIdentityConsentLevel(getIdentityConsentLevelString(from)); Optional<DetailedSample> effective = from.getEffectiveGroupIdSample(); if (effective.isPresent()) { dto.setEffectiveGroupId(effective.get().getGroupId()); dto.setEffectiveGroupIdSample(effective.get().getAlias()); if (from.getGroupId() != null) { dto.setGroupId(from.getGroupId()); if (from.getGroupDescription() != null) { dto.setGroupDescription(from.getGroupDescription()); if (from.isSynthetic() != null) { dto.setSynthetic(from.isSynthetic());
DetailedSample sample = (DetailedSample) stock; aliquot.setScientificName(sample.getScientificName()); aliquot.setSampleType(sample.getSampleType()); parent.setId(sample.getId()); aliquot.setParent(parent); if (sample.getSubproject() != null) aliquot.setSubproject(sample.getSubproject()); aliquot.setGroupId(sample.getGroupId()); aliquot.setGroupDescription(sample.getGroupDescription()); aliquot.setSampleClass(sampleClassService.getAll().stream() .filter(sampleClass -> { validRelationship -> !validRelationship.getArchived() && validRelationship.getChild().getId().equals(sampleClass.getId()) && validRelationship.getParent().getId().equals(sample.getSampleClass().getId())); } catch (IOException e) { log.error("Error getting SampleValidRelationship", e); aliquot.setSamplePurpose(samplePurposeService.getAll().stream().filter(samplePurpose -> samplePurpose.getAlias().equals("Library")) .findFirst().orElse(null)); aliquot.setProject(sample.getProject());
if (sai.getSampleClass() != null && sai.getSampleClass().getId() != null) { sai.setSampleClass(sampleClassService.get(sai.getSampleClass().getId())); if (sai.getDetailedQcStatus() != null && sai.getDetailedQcStatus().getId() != null) { sai.setDetailedQcStatus(detailedQcStatusDao.getDetailedQcStatus(sai.getDetailedQcStatus().getId())); if (sai.getSubproject() != null && sai.getSubproject().getId() != SubprojectImpl.UNSAVED_ID) { sai.setSubproject(subProjectDao.getSubproject(sai.getSubproject().getId()));
if (childDto.getParentId() != null) { parent = new DetailedSampleImpl(); parent.setId(childDto.getParentId()); } else { if (childDto instanceof SampleIdentityDto && childDto.getClass() != SampleIdentityDto.class) { tissue.setSampleClass(new SampleClassImpl()); tissue.getSampleClass().setId(childDto.getParentTissueSampleClassId()); tissue.setParent(parent); parent = tissue; SampleStockDto stockDto = (SampleStockDto) childDto; DetailedSample tissueProcessing = toSingleCellSample((SampleSingleCellRelative) childDto); tissueProcessing.setSampleClass(new SampleClassImpl()); tissueProcessing.getSampleClass().setId(stockDto.getTissueProcessingClassId()); tissueProcessing.setParent(parent); parent = tissueProcessing; SampleAliquotDto aliquotDto = (SampleAliquotDto) childDto; DetailedSample stock = toStockSample((SampleStockDto) childDto); stock.setSampleClass(new SampleClassImpl()); stock.getSampleClass().setId(aliquotDto.getStockClassId()); stock.setParent(parent); parent = stock; parentAliquot.setSampleClass(new SampleClassImpl()); parentAliquot.getSampleClass().setId(aliquotDto.getParentAliquotClassId()); parentAliquot.setParent(parent); parent = parentAliquot;
if (detailed.getParent() == null) { throw new IllegalArgumentException(ERR_MISSING_PARENT_ID); if (detailed.getParent().getId() != SampleImpl.UNSAVED_ID) { detailed.setParent((DetailedSample) get(detailed.getParent().getId())); } else { try { setIdentity(detailed); if (!isIdentitySample(detailed.getParent())) { detailed.setParent(findOrCreateParent(detailed)); detailed.inheritPermissions(detailed.getParent() == null ? detailed.getProject() : detailed.getParent()); } else { sample.inheritPermissions(sample.getProject());
@Override public void update(Sample sample) throws IOException { Sample managed = get(sample.getId()); managed.setChangeDetails(authorizationManager.getCurrentUser()); boolean validateAliasUniqueness = !managed.getAlias().equals(sample.getAlias()); authorizationManager.throwIfNotWritable(managed); maybeRemoveFromBox(sample); boxService.throwIfBoxPositionIsFilled(sample); validateChange(sample, managed); applyChanges(managed, sample); loadChildEntities(managed); if (isDetailedSample(managed)) { DetailedSample detailedUpdated = (DetailedSample) managed; if (detailedUpdated.getParent() != null) { detailedUpdated.setParent((DetailedSample) get(detailedUpdated.getParent().getId())); validateHierarchy(detailedUpdated); } } save(managed, validateAliasUniqueness); boxService.updateBoxableLocation(sample); }
dto.setEffectiveGroupIdSample(from.getAlias()); } else { Optional<DetailedSample> effective = ((DetailedSample) from.getSample()).getEffectiveGroupIdSample(); effective.ifPresent(upstream -> { dto.setEffectiveGroupId(upstream.getGroupId()); dto.setEffectiveGroupIdSample(upstream.getAlias()); }); dto.setIdentityConsentLevel(getIdentityConsentLevelString((DetailedSample) from.getSample())); DetailedSample detailed = (DetailedSample) from.getSample(); if (detailed.getSubproject() != null) { dto.setSubprojectAlias(detailed.getSubproject().getAlias()); dto.setSubprojectPriority(detailed.getSubproject().getPriority());
public static SampleDto asMinimalDto(@Nonnull Sample from) { DetailedSampleDto dto = new DetailedSampleDto(); copySampleFields(from, dto, false); if (isDetailedSample(from)) { DetailedSample detailed = (DetailedSample) from; dto.setSampleClassId(detailed.getSampleClass().getId()); dto.setCreationDate(detailed.getCreationDate() == null ? "" : formatDate(detailed.getCreationDate())); dto.setIdentityConsentLevel(getIdentityConsentLevelString(detailed)); if (detailed.getSubproject() != null) { dto.setSubprojectAlias(detailed.getSubproject().getAlias()); dto.setSubprojectPriority(detailed.getSubproject().getPriority()); } } return dto; }
private String addSiblingTag(String parentAlias, DetailedSample sample) throws IOException { SampleClass sc = sample.getSampleClass(); if (sc == null || sc.getSuffix() == null) { throw new InvalidParameterException("Unexpected null SampleClass or suffix"); } String partialAlias = parentAlias + SEPARATOR + sc.getSuffix(); if (sample.getSiblingNumber() == null) { if (siblingNumberGenerator == null) { throw new IllegalStateException("No SiblingNumberGenerator configured"); } sample.setSiblingNumber(siblingNumberGenerator.getNextSiblingNumber(SampleImpl.class, partialAlias)); } String siblingNum = sample.getSiblingNumber().toString(); // Sibling number is only padded for Tissue Processing if (isTissueProcessingSample(sample)) { while (siblingNum.length() < 2) siblingNum = "0" + siblingNum; } return partialAlias + siblingNum; }
@Override public String generate(Sample sample) throws MisoNamingException, IOException { if (!LimsUtils.isDetailedSample(sample)) { throw new IllegalArgumentException("Can only generate an alias for detailed samples"); } DetailedSample detailed = (DetailedSample) sample; if (isIdentitySample(detailed)) { return generateIdentityAlias((SampleIdentity) detailed); } for (DetailedSample parent = detailed.getParent(); parent != null; parent = parent.getParent()) { if (isAliquotSample(parent)) { return addSiblingTag(parent.getAlias(), detailed); } if (isTissueSample(parent)) { if (isTissueSample(detailed)) { // tissues parented to tissues return generateTissueAlias((SampleTissue) detailed, LimsUtils.getParent(SampleIdentity.class, parent)); } else { return addSiblingTag(parent.getAlias(), detailed); } } if (isIdentitySample(parent)) { if (!isTissueSample(detailed)) throw new IllegalArgumentException("Missing parent tissue"); return generateTissueAlias((SampleTissue) detailed, (SampleIdentity) parent); } } throw new IllegalStateException("Unexpected conditions for alias generation"); }
public static <T extends DetailedSample> T getParent(Class<T> targetParentClass, DetailedSample start) { for (DetailedSample current = deproxify(start.getParent()); current != null; current = deproxify(current.getParent())) { if (targetParentClass.isInstance(current)) { return targetParentClass.cast(current); } } return null; }
@Override public SampleTissue getMatchingGhostTissue(SampleTissue tissue) { validateGhostTissueLookup(tissue); Criteria criteria = currentSession().createCriteria(SampleTissueImpl.class); criteria.add(Restrictions.eq("isSynthetic", true)); criteria.add(Restrictions.eq("parent.id", tissue.getParent().getId())); criteria.add(Restrictions.eq("tissueOrigin.id", tissue.getTissueOrigin().getId())); criteria.add(Restrictions.eq("tissueType.id", tissue.getTissueType().getId())); criteria.add(Restrictions.eq("timesReceived", tissue.getTimesReceived())); criteria.add(Restrictions.eq("tubeNumber", tissue.getTubeNumber())); if (tissue.getPassageNumber() == null) { criteria.add(Restrictions.isNull("passageNumber")); } else { criteria.add(Restrictions.eq("passageNumber", tissue.getPassageNumber())); } return (SampleTissue) criteria.uniqueResult(); }