private Collection<SampleIdentity> filterOnlyExactExternalNameMatches(Collection<SampleIdentity> candidates, String externalNamesOrAlias) { return candidates.stream().filter(sam -> { Set<String> targets = SampleIdentityImpl.getSetFromString(externalNamesOrAlias).stream().map(String::toLowerCase) .collect(Collectors.toSet()); Set<String> externalNamesOfCandidate = SampleIdentityImpl.getSetFromString(sam.getExternalName()).stream() .map(String::toLowerCase).collect(Collectors.toSet()); targets.retainAll(externalNamesOfCandidate); return !targets.isEmpty() || externalNamesOrAlias.equals(sam.getAlias()); }).collect(Collectors.toSet()); }
private void applyIdentityChanges(SampleIdentity target, SampleIdentity source) throws IOException { if (!source.getExternalName().equals(target.getExternalName())) { confirmExternalNameUniqueForProjectIfRequired(source.getExternalName(), target); Set<String> sourceExternalNames = SampleIdentityImpl.getSetFromString(source.getExternalName()); Set<String> targetExternalNames = SampleIdentityImpl.getSetFromString(target.getExternalName()); if (!sourceExternalNames.containsAll(targetExternalNames) || !targetExternalNames.containsAll(sourceExternalNames)) { target.setExternalName(source.getExternalName()); } } target.setDonorSex(source.getDonorSex()); target.setConsentLevel(source.getConsentLevel()); }
/** * Adds any external names in the sample's attached identity to the identity stored in the database * * @param sample * @throws IOException */ private void addExternalNames(DetailedSample sample, SampleIdentity identityCopy) throws IOException { if (identityCopy == null || identityCopy.getExternalName() == null) return; SampleIdentity identity = (SampleIdentity) get(getIdentity(sample).getId()); Set<String> identityExternalNames = SampleIdentityImpl.getSetFromString(identity.getExternalName()); Set<String> tempExternalNames = SampleIdentityImpl.getSetFromString(identityCopy.getExternalName()); Set<String> lowerCaseIdentityExternalNames = identityExternalNames.stream().map(String::toLowerCase).collect(Collectors.toSet()); for (String name : tempExternalNames) { if (!lowerCaseIdentityExternalNames.contains(name.toLowerCase()) && !(isUniqueExternalNameWithinProjectRequired() && (identity.getProject() == null || getIdentitiesByExternalNameOrAliasAndProject(name, identity.getProject().getId(), true).size() > 0))) { identityExternalNames.add(name); } } if (identityExternalNames.size() > lowerCaseIdentityExternalNames.size()) { identity.setExternalName(String.join(",", identityExternalNames)); identity.setChangeDetails(authorizationManager.getCurrentUser()); sampleStore.update(identity); } }
private SampleIdentity buildIdentity() { if (externalName == null) { throw new NullPointerException("Missing externalName"); } SampleIdentity identity = new SampleIdentityImpl(); identity.setExternalName(externalName); identity.setDonorSex(donorSex); return identity; }
/** * Returns true if another sample with same external name and project exists in database * * @param sample * @return boolean * @throws IOException */ private boolean isExternalNameDuplicatedInProject(Sample sample) throws IOException { SampleIdentity identity = (SampleIdentity) sample; return getIdentitiesByExternalNameOrAliasAndProject(identity.getExternalName(), identity.getProject().getId(), true).size() > 0; }
private static SampleIdentityDto asIdentitySampleDto(@Nonnull SampleIdentity from) { SampleIdentityDto dto = new SampleIdentityDto(); dto.setExternalName(from.getExternalName()); dto.setDonorSex(from.getDonorSex().getLabel()); if (from.getConsentLevel() != null) { dto.setConsentLevel(from.getConsentLevel().getLabel()); // set here too, so it can be checked consistently for all DetailedSampleDtos dto.setIdentityConsentLevel(from.getConsentLevel().getLabel()); } return dto; }
private static SampleIdentity toIdentitySample(@Nonnull SampleIdentityDto from) { SampleIdentity to = new SampleIdentityImpl(); to.setExternalName(from.getExternalName()); if (from.getDonorSex() != null) { to.setDonorSex(from.getDonorSex()); } if (from.getConsentLevel() != null) { to.setConsentLevel(ConsentLevel.getByLabel(from.getConsentLevel())); } return to; }
if (!matches.isEmpty()) { for (SampleIdentity match : matches) { if (match.getId() != sample.getId()) { Set<String> matchExtNames = SampleIdentityImpl.getSetFromString(match.getExternalName()); Set<String> newExtNames = SampleIdentityImpl.getSetFromString(newExternalName); newExtNames.retainAll(matchExtNames); throw new ConstraintViolationException( "Duplicate external names not allowed within a project: External name \"" + String.join(",", newExtNames) + "\" is already associated with Identity " + match.getAlias() + " (" + match.getExternalName() + ")", null, "externalName");
private SampleIdentity findOrCreateIdentity(DetailedSample descendant, SampleIdentity identity) throws IOException, MisoNamingException { if (identity.getId() != SampleImpl.UNSAVED_ID) { return (SampleIdentity) sampleStore.getSample(identity.getId()); } else { // If samples are being bulk received for the same new donor, they will all have a null parentId. // After the new donor's Identity is created, the following samples need to be parented to that now-existing Identity. Collection<SampleIdentity> newlyCreated = getIdentitiesByExternalNameOrAliasAndProject(identity.getExternalName(), descendant.getProject().getId(), true); if (newlyCreated.size() > 1) { throw new IllegalArgumentException( "IdentityId is required since there are multiple identities with external name " + identity.getExternalName() + " in project " + descendant.getProject().getId()); } else if (newlyCreated.size() == 1) { Sample parent = newlyCreated.iterator().next(); if (parent == null) throw new IllegalArgumentException("Parent sample does not exist"); else return (SampleIdentity) parent; } else { try { return createParentIdentity(descendant, identity); } catch (SQLException e) { throw new IOException(e); } } } }
public static ConsentLevel getIdentityConsentLevel(DetailedSample sample) { SampleIdentity identity = null; if (isIdentitySample(sample)) { identity = (SampleIdentity) sample; } else { identity = LimsUtils.getParent(SampleIdentity.class, sample); } if (identity != null && identity.getConsentLevel() != null) { return identity.getConsentLevel(); } return null; }
private String generateTissueAlias(SampleTissue tissue, SampleIdentity identity) { StringBuilder sb = new StringBuilder(); sb.append(identity.getAlias()) .append(SEPARATOR) .append(tissue.getTissueOrigin() == null ? TISSUE_ORIGIN_UNKNOWN : tissue.getTissueOrigin().getAlias()) .append(SEPARATOR) .append(tissue.getTissueType() == null ? TISSUE_TYPE_UNKNOWN : tissue.getTissueType().getAlias()) .append(SEPARATOR) .append(passageNumber(tissue.getPassageNumber())) .append(SEPARATOR) .append(tissue.getTimesReceived()); if (tissue.getTubeNumber() != null) { sb.append(DASH) .append(tissue.getTubeNumber()); } return sb.toString(); }
} else { if (isUniqueExternalNameWithinProjectRequired() && isExternalNameDuplicatedInProject(sample)) { throw new IllegalArgumentException("Sample with external name '" + ((SampleIdentity) sample).getExternalName() + "' already exists in project " + sample.getProject().getShortName());
throw new IllegalStateException("Missing Identity at root of hierarchy"); identity.setExternalName(from.getExternalNames());
private String generateIdentityAlias(SampleIdentity identity) throws IOException { if (identity.getProject().getShortName() == null) { throw new NullPointerException("Project shortname required to generate Identity alias"); } String internalName = identity.getProject().getShortName() + "_"; String number = sampleNumberPerProjectService.nextNumber(identity.getProject(), internalName); internalName += number; return internalName; }
private SampleIdentity createParentIdentity(DetailedSample sample, SampleIdentity identity) throws IOException, MisoNamingException, SQLException { log.debug("Creating a new Identity to use as a parent."); List<SampleClass> identityClasses = sampleClassService.listByCategory(SampleIdentity.CATEGORY_NAME); if (identityClasses.size() != 1) { throw new IllegalStateException("Found more or less than one SampleClass of category " + SampleIdentity.CATEGORY_NAME + ". Cannot choose which to use as root sample class."); } SampleClass rootSampleClass = identityClasses.get(0); confirmExternalNameUniqueForProjectIfRequired(identity.getExternalName(), sample); Sample identitySample = new IdentityBuilder().project(sample.getProject()) .sampleType(sample.getSampleType()).scientificName(sample.getScientificName()).name(generateTemporaryName()) .rootSampleClass(rootSampleClass).volume(0D).externalName(identity.getExternalName()) .donorSex(identity.getDonorSex()).consentLevel(identity.getConsentLevel()).build(); identitySample.setAlias(namingScheme.generateSampleAlias(identitySample)); identitySample.setChangeDetails(authorizationManager.getCurrentUser()); identitySample.inheritPermissions(sample.getProject()); return (SampleIdentity) save(identitySample, true); }