Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion api/src/org/labkey/api/search/SearchService.java
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ public String toString()
}
}

enum SEARCH_PHASE {createQuery, buildSecurityFilter, search, applySecurityFilter, processHits}
enum SEARCH_PHASE {createQuery, buildSecurityFilterOld, buildSecurityFilter, search, applySecurityFilter, processHits}

interface TaskListener
{
Expand Down Expand Up @@ -305,6 +305,17 @@ public String toString()
return _name;
}

/**
* Permission required, beyond base container Read (which every searchable container already has), for this
* category's documents to be visible. Return null if base Read is sufficient.
*/
@Nullable
public Class<? extends Permission> getRequiredPermission()
{
return null;
}

@Deprecated // TODO: Remove after testing
protected Set<String> getPermittedContainerIds(User user, Map<String, Container> containers, @NotNull Class<? extends Permission> perm)
{
Set<String> containerIds = new HashSet<>();
Expand All @@ -315,6 +326,7 @@ protected Set<String> getPermittedContainerIds(User user, Map<String, Container>
return containerIds.size() == containers.size() ? containers.keySet() : containerIds;
}

@Deprecated // TODO: Remove after testing
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
return containers.keySet();
Expand Down
22 changes: 22 additions & 0 deletions api/src/org/labkey/api/util/MultiPhaseCPUTimer.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public class MultiPhaseCPUTimer<K extends Enum<K>>
private final K[] _values;

private long _count = 0;
private boolean _clearedFirstInvocation = false;

public MultiPhaseCPUTimer(Class<K> clazz, K[] values)
{
Expand Down Expand Up @@ -87,6 +88,27 @@ public Map<String, Double> getTimes()
return map;
}

public void clearTimes()
{
synchronized (_accumulationMap)
{
_accumulationMap.values().forEach(v -> v.setValue(0));
_count = 0;
}
}

public void clearTimesIfFirstInvocation()
{
synchronized (_accumulationMap)
{
if (!_clearedFirstInvocation)
{
_clearedFirstInvocation = true;
clearTimes();
}
}
}

// Create an enum map and populate it with MutableLongs for each value
private static <ENUM extends Enum<ENUM>> Map<ENUM, MutableLong> getEnumMap(Class<ENUM> clazz, ENUM[] values)
{
Expand Down
19 changes: 19 additions & 0 deletions assay/src/org/labkey/assay/AssayManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
import org.labkey.api.security.User;
import org.labkey.api.security.permissions.AssayReadPermission;
import org.labkey.api.security.permissions.InsertPermission;
import org.labkey.api.security.permissions.Permission;
import org.labkey.api.settings.AppProps;
import org.labkey.api.study.assay.ParticipantVisitResolver;
import org.labkey.api.study.assay.ParticipantVisitResolverType;
Expand Down Expand Up @@ -119,20 +120,38 @@
public class AssayManager implements AssayService
{
SearchService.SearchCategory ASSAY_CATEGORY = new SearchService.SearchCategory("assay", "Assays") {
@Override
public Class<? extends Permission> getRequiredPermission()
{
return AssayReadPermission.class;
}

@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
return getPermittedContainerIds(user, containers, AssayReadPermission.class);
}
};
SearchService.SearchCategory ASSAY_BATCH_CATEGORY = new SearchService.SearchCategory("assayBatch", "Assay Batches", false) {
@Override
public Class<? extends Permission> getRequiredPermission()
{
return AssayReadPermission.class;
}

@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
return getPermittedContainerIds(user, containers, AssayReadPermission.class);
}
};
SearchService.SearchCategory ASSAY_RUN_CATEGORY = new SearchService.SearchCategory("assayRun", "Assay Runs", false) {
@Override
public Class<? extends Permission> getRequiredPermission()
{
return AssayReadPermission.class;
}

@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
Expand Down
3 changes: 3 additions & 0 deletions assay/src/org/labkey/assay/plate/PlateManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,9 @@ public class PlateManager implements PlateService, AssayListener, ExperimentList
// when those calls are being made for a plate save operation.
public static final String PLATE_SAVE_FLAG = ".plateSave";

// No getRequiredPermission() override needed: base container Read (already required to reach this category's
// containers) is sufficient. The old getPermittedContainerIds() override below is kept temporarily for
// old-vs-new comparison testing even though it's a redundant re-check of Read permission.
public SearchService.SearchCategory PLATE_CATEGORY = new SearchService.SearchCategory("plate", "Assay Plates", false) {
@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
Expand Down
13 changes: 13 additions & 0 deletions experiment/src/org/labkey/experiment/api/ExpDataClassImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import org.labkey.api.security.User;
import org.labkey.api.security.permissions.DataClassReadPermission;
import org.labkey.api.security.permissions.MediaReadPermission;
import org.labkey.api.security.permissions.Permission;
import org.labkey.api.util.PageFlowUtil;
import org.labkey.api.util.Path;
import org.labkey.api.util.UnexpectedException;
Expand Down Expand Up @@ -75,13 +76,25 @@ public class ExpDataClassImpl extends ExpIdentifiableEntityImpl<DataClass> imple
private static final String SEARCH_CATEGORY_NAME = "dataClass";
private static final String MEDIA_SEARCH_CATEGORY_NAME = "media";
public static final SearchService.SearchCategory SEARCH_CATEGORY = new SearchService.SearchCategory(SEARCH_CATEGORY_NAME, "Collections of data objects", false) {
@Override
public Class<? extends Permission> getRequiredPermission()
{
return DataClassReadPermission.class;
}

@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
return getPermittedContainerIds(user, containers, DataClassReadPermission.class);
}
};
public static final SearchService.SearchCategory MEDIA_SEARCH_CATEGORY = new SearchService.SearchCategory(MEDIA_SEARCH_CATEGORY_NAME, "Collections of media data and samples", false) {
@Override
public Class<? extends Permission> getRequiredPermission()
{
return MediaReadPermission.class;
}

@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
Expand Down
12 changes: 12 additions & 0 deletions experiment/src/org/labkey/experiment/api/ExpDataImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,25 @@ public Class<? extends Permission> getPermissionClass()
}

public static final SearchService.SearchCategory expDataCategory = new SearchService.SearchCategory("data", "ExpData", false) {
@Override
public Class<? extends Permission> getRequiredPermission()
{
return DataClassReadPermission.class;
}

@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
return getPermittedContainerIds(user, containers, DataClassReadPermission.class);
}
};
public static final SearchService.SearchCategory expMediaDataCategory = new SearchService.SearchCategory("mediaData", "ExpData for media objects", false) {
@Override
public Class<? extends Permission> getRequiredPermission()
{
return MediaReadPermission.class;
}

@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
Expand Down
7 changes: 7 additions & 0 deletions experiment/src/org/labkey/experiment/api/ExpMaterialImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
import org.labkey.api.search.SearchService;
import org.labkey.api.security.User;
import org.labkey.api.security.permissions.MediaReadPermission;
import org.labkey.api.security.permissions.Permission;
import org.labkey.api.study.StudyService;
import org.labkey.api.util.JobRunner;
import org.labkey.api.util.PageFlowUtil;
Expand Down Expand Up @@ -87,6 +88,12 @@ public class ExpMaterialImpl extends AbstractRunItemImpl<Material> implements Ex
{
public static final SearchService.SearchCategory searchCategory = new SearchService.SearchCategory("material", "Materials/Samples", false);
public static final SearchService.SearchCategory mediaSearchCategory = new SearchService.SearchCategory("media", "Media Samples", false){
@Override
public Class<? extends Permission> getRequiredPermission()
{
return MediaReadPermission.class;
}

@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
import org.labkey.api.search.SearchService;
import org.labkey.api.security.User;
import org.labkey.api.security.permissions.MediaReadPermission;
import org.labkey.api.security.permissions.Permission;
import org.labkey.api.study.StudyService;
import org.labkey.api.util.PageFlowUtil;
import org.labkey.api.util.Path;
Expand Down Expand Up @@ -96,6 +97,12 @@ public class ExpSampleTypeImpl extends ExpIdentifiableEntityImpl<MaterialSource>
private static final String mediaCategoryName = "mediaMaterialSource";
public static final SearchService.SearchCategory searchCategory = new SearchService.SearchCategory(categoryName, "Sample Types", false);
public static final SearchService.SearchCategory mediaSearchCategory = new SearchService.SearchCategory(mediaCategoryName, "Media Sample Types", false) {
@Override
public Class<? extends Permission> getRequiredPermission()
{
return MediaReadPermission.class;
}

@Override
public Set<String> getPermittedContainerIds(User user, Map<String, Container> containers)
{
Expand Down
3 changes: 2 additions & 1 deletion search/src/org/labkey/search/SearchModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import org.labkey.search.model.PlainTextDocumentParser;
import org.labkey.search.model.SearchSchema;
import org.labkey.search.model.SearchStartupProperties;
import org.labkey.search.model.SecurityQuery;
import org.labkey.search.view.SearchWebPartFactory;

import javax.management.StandardMBean;
Expand Down Expand Up @@ -259,7 +260,7 @@ private void reindexIfNeeded(@NotNull SearchService ss)
@Override
public @NotNull Set<Class<?>> getUnitTests()
{
return Set.of(AbstractSearchService.TestCase.class);
return Set.of(AbstractSearchService.TestCase.class, SecurityQuery.TestCase.class);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1824,6 +1824,7 @@ else if (options.sortField.equals(FIELD_NAME.container.name()))
finally
{
TIMER.releaseInvocationTimer(iTimer);
TIMER.clearTimesIfFirstInvocation(); // Toss the very first invocation since it likely had to warm the caches, etc.
}
}

Expand Down
Loading