Skip to content

Commit 86492b5

Browse files
committed
Refactor
1 parent ab462db commit 86492b5

2 files changed

Lines changed: 39 additions & 50 deletions

File tree

src/main/java/org/prebid/server/auction/ExchangeService.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -581,8 +581,8 @@ private EidPermissionHolder getEidPermissions(ExtRequestPrebid prebid) {
581581
return Optional.ofNullable(prebid)
582582
.map(ExtRequestPrebid::getData)
583583
.map(ExtRequestPrebidData::getEidPermissions)
584-
.map(EidPermissionHolder::new)
585-
.orElse(null);
584+
.map(EidPermissionHolder::of)
585+
.orElse(EidPermissionHolder.empty());
586586
}
587587

588588
private static List<String> firstPartyDataBidders(ExtRequest requestExt) {
@@ -670,16 +670,10 @@ private List<Eid> extractUserEids(User user) {
670670
private List<Eid> resolveAllowedEids(List<Eid> userEids, String bidder, EidPermissionHolder eidPermissionHolder) {
671671
return CollectionUtils.emptyIfNull(userEids)
672672
.stream()
673-
.filter(userEid -> isUserEidAllowed(userEid, eidPermissionHolder, bidder))
673+
.filter(userEid -> eidPermissionHolder.isAllowed(userEid, bidder))
674674
.toList();
675675
}
676676

677-
private boolean isUserEidAllowed(Eid eid,
678-
EidPermissionHolder eidPermissionHolder,
679-
String bidder) {
680-
return eidPermissionHolder == null || eidPermissionHolder.isAllowed(eid, bidder);
681-
}
682-
683677
private List<AuctionParticipation> getAuctionParticipation(
684678
List<BidderPrivacyResult> bidderPrivacyResults,
685679
BidRequest bidRequest,

src/main/java/org/prebid/server/auction/model/EidPermissionHolder.java

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,60 @@
11
package org.prebid.server.auction.model;
22

33
import com.iab.openrtb.request.Eid;
4-
import org.apache.commons.lang3.ObjectUtils;
54
import org.apache.commons.lang3.StringUtils;
65
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions;
76

7+
import java.util.ArrayList;
8+
import java.util.Collections;
89
import java.util.List;
10+
import java.util.Map;
11+
import java.util.Objects;
12+
import java.util.stream.Collectors;
13+
import java.util.stream.Stream;
914

1015
public final class EidPermissionHolder {
1116

1217
private static final String WILDCARD_BIDDER = "*";
1318

14-
private final List<ExtRequestPrebidDataEidPermissions> eidPermissions;
15-
16-
public EidPermissionHolder(List<ExtRequestPrebidDataEidPermissions> eidPermissions) {
17-
this.eidPermissions = eidPermissions;
18-
}
19-
20-
public boolean isAllowed(Eid eid, String bidder) {
21-
if (ObjectUtils.isEmpty(eidPermissions)) {
22-
return true;
23-
}
19+
private static final ExtRequestPrebidDataEidPermissions DEFAULT_RULE = ExtRequestPrebidDataEidPermissions.builder()
20+
.bidders(Collections.singletonList(WILDCARD_BIDDER))
21+
.build();
2422

25-
boolean isBestMatch = false;
26-
int bestSpecificity = -1;
23+
private static final EidPermissionHolder EMPTY = new EidPermissionHolder(Collections.emptyList());
2724

28-
for (ExtRequestPrebidDataEidPermissions eidPermission : eidPermissions) {
29-
if (!isRuleMatched(eid, eidPermission)) {
30-
continue;
31-
}
25+
private final List<ExtRequestPrebidDataEidPermissions> eidPermissions;
3226

33-
final int ruleSpecificity = getRuleSpecificity(eidPermission);
27+
private EidPermissionHolder(List<ExtRequestPrebidDataEidPermissions> eidPermissions) {
28+
this.eidPermissions = new ArrayList<>(eidPermissions);
29+
this.eidPermissions.add(DEFAULT_RULE);
30+
}
3431

35-
final boolean isBidderAllowed = isBidderAllowed(bidder, eidPermission.getBidders());
32+
public static EidPermissionHolder of(List<ExtRequestPrebidDataEidPermissions> eidPermissions) {
33+
return new EidPermissionHolder(eidPermissions);
34+
}
3635

37-
if (ruleSpecificity > bestSpecificity) {
38-
bestSpecificity = ruleSpecificity;
39-
isBestMatch = isBidderAllowed;
40-
} else if (ruleSpecificity == bestSpecificity) {
41-
isBestMatch |= isBidderAllowed;
42-
}
43-
}
36+
public static EidPermissionHolder empty() {
37+
return EMPTY;
38+
}
4439

45-
return bestSpecificity == -1 || isBestMatch;
40+
public boolean isAllowed(Eid eid, String bidder) {
41+
final Map<Integer, List<ExtRequestPrebidDataEidPermissions>> matchingRulesBySpecificity = eidPermissions
42+
.stream()
43+
.filter(rule -> isRuleMatched(eid, rule))
44+
.collect(Collectors.groupingBy(this::getRuleSpecificity));
45+
46+
final int highestSpecificityMatchingRules = Collections.max(matchingRulesBySpecificity.keySet());
47+
return matchingRulesBySpecificity.get(highestSpecificityMatchingRules).stream()
48+
.anyMatch(eidPermission -> isBidderAllowed(bidder, eidPermission.getBidders()));
4649
}
4750

4851
private int getRuleSpecificity(ExtRequestPrebidDataEidPermissions eidPermission) {
49-
int specificity = 0;
50-
if (eidPermission.getInserter() != null) {
51-
specificity++;
52-
}
53-
if (eidPermission.getSource() != null) {
54-
specificity++;
55-
}
56-
if (eidPermission.getMatcher() != null) {
57-
specificity++;
58-
}
59-
if (eidPermission.getMm() != null) {
60-
specificity++;
61-
}
62-
return specificity;
52+
return (int) Stream.of(eidPermission.getInserter(),
53+
eidPermission.getSource(),
54+
eidPermission.getMatcher(),
55+
eidPermission.getMm())
56+
.filter(Objects::nonNull)
57+
.count();
6358
}
6459

6560
private boolean isRuleMatched(Eid eid, ExtRequestPrebidDataEidPermissions eidPermission) {

0 commit comments

Comments
 (0)