diff --git a/api/src/org/labkey/api/exp/api/ExperimentService.java b/api/src/org/labkey/api/exp/api/ExperimentService.java index fd0b9fce06f..d122bcafbd4 100644 --- a/api/src/org/labkey/api/exp/api/ExperimentService.java +++ b/api/src/org/labkey/api/exp/api/ExperimentService.java @@ -1263,6 +1263,11 @@ List getExpProtocolsWithParameterValue( void clearMaterialAncestors(Collection materialRowIds); void repopulateAncestors(); + boolean hasSampleIdsNotInScope(Container container, User user, Collection sampleIds); + + boolean hasSourceIdsNotInScope(Container container, User user, Collection sourceIds); + + class XarExportOptions { String _lsidRelativizer = LSID_OPTION_FOLDER_RELATIVE; diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index 3f1c735caab..f7e704b337c 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -969,6 +969,32 @@ public List findIdsNotPermittedForOperation(List ca .map(ExpObject::getRowId).collect(Collectors.toList()); } + @Override + public boolean hasSampleIdsNotInScope(Container container, User user, Collection sampleIds) + { + return hasEntityIdsNotInScope(container, user, getTinfoMaterial(), sampleIds); + } + + @Override + public boolean hasSourceIdsNotInScope(Container container, User user, Collection sourceIds) + { + return hasEntityIdsNotInScope(container, user, getTinfoData(), sourceIds); + } + + // GitHub Issue 1309 + private boolean hasEntityIdsNotInScope(Container container, User user, TableInfo entityTable, Collection entityIds) + { + if (entityIds.isEmpty()) + return false; + + ContainerFilter cf = container.getProductFoldersDataContainerFilter(user); + SimpleFilter filter = new SimpleFilter().addInClause(FieldKey.fromParts("RowId"), entityIds); + filter.addClause(cf.createFilterClause(entityTable.getSchema(), FieldKey.fromParts("Container"))); + + Set inScope = new HashSet<>(new TableSelector(entityTable, Collections.singleton("RowId"), filter, null).getArrayList(Long.class)); + return entityIds.stream().anyMatch(id -> !inScope.contains(id)); + } + private @NotNull List getMaterials(SimpleFilter filter, @Nullable Sort sort) { return new TableSelector(getTinfoMaterial(), filter, sort).getArrayList(Material.class);