Skip to content

Commit ce4c959

Browse files
committed
Scan service loader once for filters
Use a static initializer to scan for filters instead of scanning for each getFilter call. Fixes #1348
1 parent 938dfc7 commit ce4c959

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

cdm/core/src/main/java/ucar/nc2/filter/Filters.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
/*
2-
* Copyright (c) 2021 University Corporation for Atmospheric Research/Unidata
2+
* Copyright (c) 2021-2025 University Corporation for Atmospheric Research/Unidata
33
* See LICENSE for license information.
44
*/
55

66
package ucar.nc2.filter;
77

8+
import com.google.common.collect.ImmutableList;
89
import java.util.Map;
910
import java.util.ServiceLoader;
1011

1112
public class Filters {
1213

14+
private static final ImmutableList<FilterProvider> spFilters;
15+
16+
// load filter service providers
17+
static {
18+
ImmutableList.Builder<FilterProvider> spFiltersBuilder = ImmutableList.builder();
19+
for (FilterProvider fp : ServiceLoader.load(FilterProvider.class)) {
20+
spFiltersBuilder.add(fp);
21+
}
22+
spFilters = spFiltersBuilder.build();
23+
}
24+
1325
/**
1426
* Set of common properties used by Filters
1527
*/
@@ -54,14 +66,14 @@ public static Filter getFilter(Map<String, Object> properties) throws UnknownFil
5466
String name = (String) properties.get(Keys.NAME);
5567
Object oid = properties.get(Keys.ID);
5668
// if no id or name, return null filter
57-
if ((name == null || name.isEmpty()) && !(oid instanceof Number)) {
69+
final boolean missingName = name == null || name.isEmpty();
70+
if (missingName && !(oid instanceof Number)) {
5871
return nullFilter;
5972
}
6073

6174
// try by name first
62-
if (name != null && !name.isEmpty()) {
63-
// look for dynamically loaded filters by name
64-
for (FilterProvider fp : ServiceLoader.load(FilterProvider.class)) {
75+
if (!missingName) {
76+
for (FilterProvider fp : spFilters) {
6577
if (fp.canProvide(name)) {
6678
return fp.create(properties);
6779
}
@@ -70,8 +82,7 @@ public static Filter getFilter(Map<String, Object> properties) throws UnknownFil
7082

7183
// try by id next
7284
int id = ((Short) oid).intValue();
73-
// look for dynamically loaded filters by id
74-
for (FilterProvider fp : ServiceLoader.load(FilterProvider.class)) {
85+
for (FilterProvider fp : spFilters) {
7586
if (fp.canProvide(id)) {
7687
return fp.create(properties);
7788
}

0 commit comments

Comments
 (0)