Skip to content

Commit cd3135a

Browse files
committed
cleaner mergeEntitlements
1 parent a105803 commit cd3135a

File tree

1 file changed

+24
-20
lines changed
  • libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy

1 file changed

+24
-20
lines changed

libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyUtils.java

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.core.Strings;
1313
import org.elasticsearch.entitlement.runtime.policy.entitlements.Entitlement;
1414
import org.elasticsearch.entitlement.runtime.policy.entitlements.FilesEntitlement;
15+
import org.elasticsearch.entitlement.runtime.policy.entitlements.WriteSystemPropertiesEntitlement;
1516
import org.elasticsearch.logging.LogManager;
1617
import org.elasticsearch.logging.Logger;
1718

@@ -29,6 +30,7 @@
2930
import java.util.List;
3031
import java.util.Map;
3132
import java.util.Set;
33+
import java.util.function.Function;
3234
import java.util.stream.Collectors;
3335
import java.util.stream.Stream;
3436

@@ -44,10 +46,10 @@ public static List<Scope> mergeScopes(List<Scope> mainScopes, List<Scope> additi
4446
var additionalScopesMap = additionalScopes.stream().collect(Collectors.toMap(Scope::moduleName, Scope::entitlements));
4547
for (var mainScope : mainScopes) {
4648
List<Entitlement> additionalEntitlements = additionalScopesMap.remove(mainScope.moduleName());
47-
if (additionalEntitlements != null) {
48-
result.add(new Scope(mainScope.moduleName(), mergeEntitlements(mainScope.entitlements(), additionalEntitlements)));
49-
} else {
49+
if (additionalEntitlements == null) {
5050
result.add(mainScope);
51+
} else {
52+
result.add(new Scope(mainScope.moduleName(), mergeEntitlements(mainScope.entitlements(), additionalEntitlements)));
5153
}
5254
}
5355

@@ -58,24 +60,26 @@ public static List<Scope> mergeScopes(List<Scope> mainScopes, List<Scope> additi
5860
}
5961

6062
static List<Entitlement> mergeEntitlements(List<Entitlement> a, List<Entitlement> b) {
61-
Map<Class<? extends Entitlement>, List<Entitlement>> allEntitlements = Stream.concat(a.stream(), b.stream())
62-
.collect(Collectors.groupingBy(Entitlement::getClass));
63-
64-
List<Entitlement> result = new ArrayList<>();
65-
for (var entitlements : allEntitlements.entrySet()) {
66-
var entitlementClass = entitlements.getKey();
67-
if (entitlementClass.equals(FilesEntitlement.class)) {
68-
var filesData = entitlements.getValue().stream().flatMap(entitlement -> {
69-
FilesEntitlement filesEntitlement = (FilesEntitlement) entitlement;
70-
return filesEntitlement.filesData().stream();
71-
}).filter(x -> x.platform().isCurrent()).distinct();
72-
73-
result.add(new FilesEntitlement(filesData.toList()));
74-
} else {
75-
result.add(entitlements.getValue().get(0));
76-
}
63+
Map<Class<? extends Entitlement>, Entitlement> entitlementMap = a.stream()
64+
.collect(Collectors.toMap(Entitlement::getClass, Function.identity()));
65+
66+
for (var entitlement : b) {
67+
entitlementMap.merge(entitlement.getClass(), entitlement, PolicyUtils::mergeEntitlement);
7768
}
78-
return result;
69+
return entitlementMap.values().stream().toList();
70+
}
71+
72+
static Entitlement mergeEntitlement(Entitlement entitlement1, Entitlement entitlement2) {
73+
return switch (entitlement1) {
74+
case FilesEntitlement e -> new FilesEntitlement(
75+
Stream.concat(e.filesData().stream(), ((FilesEntitlement) entitlement2).filesData().stream()).toList()
76+
);
77+
case WriteSystemPropertiesEntitlement e -> new WriteSystemPropertiesEntitlement(
78+
Stream.concat(e.properties().stream(), ((WriteSystemPropertiesEntitlement) entitlement2).properties().stream())
79+
.collect(Collectors.toUnmodifiableSet())
80+
);
81+
default -> entitlement1;
82+
};
7983
}
8084

8185
public record PluginData(Path pluginPath, boolean isModular, boolean isExternalPlugin) {

0 commit comments

Comments
 (0)