From ae21e9d006dfdf8bbec27ba9d99ae35be3aea6c8 Mon Sep 17 00:00:00 2001 From: Dmytro Hutsalo Date: Tue, 23 Oct 2018 14:03:49 +0300 Subject: [PATCH 01/10] Support deprecated bidders --- docs/config-app.md | 1 + .../server/auction/AuctionRequestFactory.java | 1 - .../server/auction/ExchangeService.java | 62 ++++++++++++------- .../prebid/server/bidder/BidderCatalog.java | 17 +++++ .../org/prebid/server/bidder/BidderDeps.java | 4 ++ .../config/bidder/AdformConfiguration.java | 10 +++ .../bidder/AdtelligentConfiguration.java | 10 +++ .../config/bidder/AppnexusConfiguration.java | 10 +++ .../bidder/BeachfrontConfiguration.java | 10 +++ .../config/bidder/BidderConfiguration.java | 11 +++- .../bidder/BrightrollConfiguration.java | 10 +++ .../bidder/ConversantConfiguration.java | 10 +++ .../config/bidder/EplanningConfiguration.java | 10 +++ .../config/bidder/FacebookConfiguration.java | 10 +++ .../config/bidder/IndexConfiguration.java | 10 +++ .../bidder/LifestreetConfiguration.java | 10 +++ .../config/bidder/OpenxConfiguration.java | 10 +++ .../config/bidder/PubmaticConfiguration.java | 10 +++ .../bidder/PulsepointConfiguration.java | 10 +++ .../config/bidder/RubiconConfiguration.java | 10 +++ .../bidder/SomoaudienceConfiguration.java | 10 +++ .../config/bidder/SovrnConfiguration.java | 10 +++ .../server/validation/RequestValidator.java | 2 +- .../server/auction/ExchangeServiceTest.java | 22 ++++++- .../server/bidder/BidderCatalogTest.java | 20 +++--- .../server/handler/AuctionHandlerTest.java | 1 + .../server/handler/CookieSyncHandlerTest.java | 1 + 27 files changed, 267 insertions(+), 35 deletions(-) diff --git a/docs/config-app.md b/docs/config-app.md index 365d3051e8e..71714280972 100644 --- a/docs/config-app.md +++ b/docs/config-app.md @@ -55,6 +55,7 @@ There are several typical keys: - `adapters..endpoint` - the url for submitting bids. - `adapters..usersync-url` - the url for synchronizing UIDs cookie. - `adapters..pbs-enforces-gdpr` - indicates if pbs server provides gdpr support for bidder or bidder will handle it itself. +- `adapters..deprecated-names` - comma separated deprecated names of bidder. But feel free to add additional bidder's specific options. diff --git a/src/main/java/org/prebid/server/auction/AuctionRequestFactory.java b/src/main/java/org/prebid/server/auction/AuctionRequestFactory.java index 29d0e20360a..60f6b686096 100644 --- a/src/main/java/org/prebid/server/auction/AuctionRequestFactory.java +++ b/src/main/java/org/prebid/server/auction/AuctionRequestFactory.java @@ -26,7 +26,6 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequestTargeting; import org.prebid.server.validation.RequestValidator; import org.prebid.server.validation.model.ValidationResult; -import org.springframework.beans.factory.annotation.Value; import java.util.Collections; import java.util.List; diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 1369810946e..2939d0410be 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -59,6 +59,7 @@ import org.prebid.server.proto.openrtb.ext.response.ExtResponseCache; import org.prebid.server.proto.openrtb.ext.response.ExtResponseDebug; import org.prebid.server.proto.response.BidderInfo; +import org.prebid.server.spring.config.bidder.BidderConfiguration; import org.prebid.server.validation.ResponseBidValidator; import org.prebid.server.validation.model.ValidationResult; @@ -156,7 +157,23 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo final long startTime = clock.millis(); - return extractBidderRequests(bidRequest, uidsCookie, aliases, timeout) + final Map> deprecatedBiddersErrors = new HashMap<>(); + + // sanity check: discard imps without extension + final List imps = bidRequest.getImp().stream() + .filter(imp -> imp.getExt() != null) + .collect(Collectors.toList()); + + // identify valid bidders and aliases out of imps + final List bidders = imps.stream() + .flatMap(imp -> asStream(imp.getExt().fieldNames()) + .filter(bidder -> !Objects.equals(bidder, PREBID_EXT)) + .peek(s -> processDeprecatedBidder(s, deprecatedBiddersErrors)) + .filter(bidder -> isValidBidder(bidder, aliases))) + .distinct() + .collect(Collectors.toList()); + + return extractBidderRequests(bidRequest, imps, bidders, uidsCookie, aliases, timeout) .map(bidderRequests -> updateRequestMetric(bidderRequests, uidsCookie, aliases, publisherId, metricsContext)) .compose(bidderRequests -> CompositeFuture.join(bidderRequests.stream() @@ -169,10 +186,19 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo // produce response from bidder results .map(bidderResponses -> updateMetricsFromResponses(bidderResponses, publisherId)) .compose(result -> - toBidResponse(result, bidRequest, keywordsCreator, cacheInfo, timeout)) + toBidResponse(result, bidRequest, keywordsCreator, cacheInfo, timeout, deprecatedBiddersErrors)) .compose(bidResponse -> bidResponsePostProcessor.postProcess(bidRequest, uidsCookie, bidResponse)); } + private void processDeprecatedBidder(String bidder, Map> deprecatedBiddersErrors) { + if (bidderCatalog.isDeprecatedName(bidder)) { + String newBidderName = bidderCatalog.getNewNameForDeprecatedBidder(bidder); + List errors = new ArrayList<>(); + errors.add(String.format(BidderConfiguration.ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED, bidder, newBidderName)); + deprecatedBiddersErrors.put(bidder, errors); + } + } + /** * Extracts {@link ExtBidRequest} from bid request. */ @@ -253,23 +279,10 @@ private static Map> currencyRates(ExtRequestTarg * NOTE: the return list will only contain entries for bidders that both have the extension field in at least one * {@link Imp}, and are known to {@link BidderCatalog} or aliases from {@link BidRequest}.ext.prebid.aliases. */ - private Future> extractBidderRequests(BidRequest bidRequest, - UidsCookie uidsCookie, + private Future> extractBidderRequests(BidRequest bidRequest, List imps, + List bidders, UidsCookie uidsCookie, Map aliases, Timeout timeout) { - // sanity check: discard imps without extension - final List imps = bidRequest.getImp().stream() - .filter(imp -> imp.getExt() != null) - .collect(Collectors.toList()); - - // identify valid bidders and aliases out of imps - final List bidders = imps.stream() - .flatMap(imp -> asStream(imp.getExt().fieldNames()) - .filter(bidder -> !Objects.equals(bidder, PREBID_EXT)) - .filter(bidder -> isValidBidder(bidder, aliases))) - .distinct() - .collect(Collectors.toList()); - final User user = bidRequest.getUser(); final ExtUser extUser = extUser(user); final Map uidsBody = uidsFromBody(extUser); @@ -827,14 +840,15 @@ private static MetricName bidderErrorTypeToMetric(BidderError.Type errorType) { */ private Future toBidResponse(List bidderResponses, BidRequest bidRequest, TargetingKeywordsCreator keywordsCreator, BidRequestCacheInfo cacheInfo, - Timeout timeout) { + Timeout timeout, Map> deprecatedBiddersErrors) { final Set winningBids = newOrEmptySet(keywordsCreator); final Set winningBidsByBidder = newOrEmptySet(keywordsCreator); populateWinningBids(keywordsCreator, bidderResponses, winningBids, winningBidsByBidder); return toWinningBidsWithCacheIds(winningBids, bidRequest.getImp(), keywordsCreator, cacheInfo, timeout) .map(winningBidsWithCacheIds -> toBidResponseWithCacheInfo(bidderResponses, bidRequest, - keywordsCreator, winningBidsWithCacheIds, winningBidsByBidder, cacheInfo)); + keywordsCreator, winningBidsWithCacheIds, winningBidsByBidder, cacheInfo, + deprecatedBiddersErrors)); } /** @@ -994,7 +1008,8 @@ private static Map toMapBidsWithEmptyCacheIds(Set bids) { private BidResponse toBidResponseWithCacheInfo(List bidderResponses, BidRequest bidRequest, TargetingKeywordsCreator keywordsCreator, Map winningBidsWithCacheIds, - Set winningBidsByBidder, BidRequestCacheInfo cacheInfo) { + Set winningBidsByBidder, BidRequestCacheInfo cacheInfo, + Map> deprecatedBiddersErrors) { final List seatBids = bidderResponses.stream() .filter(bidderResponse -> !bidderResponse.getSeatBid().getBids().isEmpty()) .map(bidderResponse -> @@ -1002,7 +1017,7 @@ private BidResponse toBidResponseWithCacheInfo(List bidderRespon cacheInfo)) .collect(Collectors.toList()); - final ExtBidResponse bidResponseExt = toExtBidResponse(bidderResponses, bidRequest); + final ExtBidResponse bidResponseExt = toExtBidResponse(bidderResponses, bidRequest, deprecatedBiddersErrors); return BidResponse.builder() .id(bidRequest.getId()) @@ -1086,7 +1101,8 @@ private Bid toBid(BidderBid bidderBid, String bidder, TargetingKeywordsCreator k * Creates {@link ExtBidResponse} populated with response time, errors and debug info (if requested) from all * bidders */ - private static ExtBidResponse toExtBidResponse(List results, BidRequest bidRequest) { + private static ExtBidResponse toExtBidResponse(List results, BidRequest bidRequest, + Map> deprecatedBiddersErrors) { final Map> httpCalls = Objects.equals(bidRequest.getTest(), 1) ? results.stream().collect( Collectors.toMap(BidderResponse::getBidder, r -> ListUtils.emptyIfNull(r.getSeatBid().getHttpCalls()))) @@ -1096,6 +1112,8 @@ private static ExtBidResponse toExtBidResponse(List results, Bid final Map> errors = results.stream() .collect(Collectors.toMap(BidderResponse::getBidder, r -> messages(r.getSeatBid().getErrors()))); + errors.putAll(deprecatedBiddersErrors); + final Map responseTimeMillis = results.stream() .collect(Collectors.toMap(BidderResponse::getBidder, BidderResponse::getResponseTime)); diff --git a/src/main/java/org/prebid/server/bidder/BidderCatalog.java b/src/main/java/org/prebid/server/bidder/BidderCatalog.java index ce49c241a50..57bb6a0a16e 100644 --- a/src/main/java/org/prebid/server/bidder/BidderCatalog.java +++ b/src/main/java/org/prebid/server/bidder/BidderCatalog.java @@ -1,5 +1,6 @@ package org.prebid.server.bidder; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -15,9 +16,17 @@ public class BidderCatalog { private final Map bidderDepsMap; + private final Map deprecatedBidderDepsMap = new HashMap<>(); + public BidderCatalog(List bidderDeps) { bidderDepsMap = Objects.requireNonNull(bidderDeps).stream() .collect(Collectors.toMap(BidderDeps::getName, Function.identity())); + + for (BidderDeps bidderDepsInner : bidderDeps) { + for (String deprecatedBidderName : bidderDepsInner.getDeprecatedNames()) { + deprecatedBidderDepsMap.put(deprecatedBidderName, bidderDepsInner); + } + } } /** @@ -34,6 +43,14 @@ public boolean isValidName(String name) { return bidderDepsMap.containsKey(name); } + public boolean isDeprecatedName(String name) { + return deprecatedBidderDepsMap.containsKey(name); + } + + public String getNewNameForDeprecatedBidder(String name) { + return deprecatedBidderDepsMap.get(name).getName(); + } + /** * Tells if given bidder is enabled and ready for auction. */ diff --git a/src/main/java/org/prebid/server/bidder/BidderDeps.java b/src/main/java/org/prebid/server/bidder/BidderDeps.java index 3d2c06bf085..b970735500b 100644 --- a/src/main/java/org/prebid/server/bidder/BidderDeps.java +++ b/src/main/java/org/prebid/server/bidder/BidderDeps.java @@ -3,6 +3,8 @@ import lombok.AllArgsConstructor; import lombok.Value; +import java.util.List; + /** * Gathers all dependencies for bidder. */ @@ -18,6 +20,8 @@ public class BidderDeps { */ String name; + List deprecatedNames; + /** * Bidder's meta information is used in {@link org.prebid.server.handler.info.BidderDetailsHandler} handler */ diff --git a/src/main/java/org/prebid/server/spring/config/bidder/AdformConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/AdformConfiguration.java index d6b85ac53f6..8a342b4ec32 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/AdformConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/AdformConfiguration.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class AdformConfiguration extends BidderConfiguration { @@ -37,6 +39,9 @@ public class AdformConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.adform.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps adformBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -47,6 +52,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new AdformMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/AdtelligentConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/AdtelligentConfiguration.java index dc916a35525..589e17ddcc4 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/AdtelligentConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/AdtelligentConfiguration.java @@ -16,6 +16,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class AdtelligentConfiguration extends BidderConfiguration { @@ -36,11 +38,19 @@ public class AdtelligentConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.adtelligent.deprecated-names:}") + private List deprecatedNames; + @Override protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Bean BidderDeps adtelligentBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/AppnexusConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/AppnexusConfiguration.java index daf72f89832..c8d7cc82177 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/AppnexusConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/AppnexusConfiguration.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class AppnexusConfiguration extends BidderConfiguration { @@ -37,6 +39,9 @@ public class AppnexusConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.appnexus.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps appnexusBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -47,6 +52,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new AppnexusMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/BeachfrontConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/BeachfrontConfiguration.java index 425c1f423e2..f6eb050bb2d 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/BeachfrontConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/BeachfrontConfiguration.java @@ -16,6 +16,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class BeachfrontConfiguration extends BidderConfiguration { @@ -39,6 +41,9 @@ public class BeachfrontConfiguration extends BidderConfiguration { @Value("${adapters.beachfront.pbs-enforces-gdpr}") private boolean pbsEnforcesGdpr; + @Value("${adapters.beachfront.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps beachfrontBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -49,6 +54,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new BeachfrontMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java index e5059bda47c..44a4ffecbd2 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java @@ -11,17 +11,24 @@ import org.prebid.server.bidder.Usersyncer; import org.prebid.server.vertx.http.HttpClient; +import java.util.List; + public abstract class BidderConfiguration { private static final String ERROR_MESSAGE_TEMPLATE_FOR_DISABLED = "%s is not configured properly on this " + "Prebid Server deploy. If you believe this should work, contact the company hosting the service " + "and tell them to check their configuration."; + public static final String ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED = "Bidder %s has been deprecated and is no " + + "longer available. Use %s instead."; + protected BidderDeps bidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { final String bidderName = bidderName(); final MetaInfo metaInfo = createMetaInfo(); final boolean enabled = metaInfo.info().isEnabled(); + final List deprecatedNames = deprecatedNames(); + final Usersyncer usersyncer = createUsersyncer(); final Bidder bidder = enabled ? createBidder(metaInfo) @@ -33,11 +40,13 @@ protected BidderDeps bidderDeps(HttpClient httpClient, HttpAdapterConnector http final BidderRequester bidderRequester = createBidderRequester(httpClient, bidder, adapter, usersyncer, httpAdapterConnector); - return BidderDeps.of(bidderName, metaInfo, usersyncer, bidder, adapter, bidderRequester); + return BidderDeps.of(bidderName, deprecatedNames, metaInfo, usersyncer, bidder, adapter, bidderRequester); } protected abstract String bidderName(); + protected abstract List deprecatedNames(); + protected abstract MetaInfo createMetaInfo(); protected abstract Usersyncer createUsersyncer(); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/BrightrollConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/BrightrollConfiguration.java index ad5ee4b9f93..ccdbfa9f159 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/BrightrollConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/BrightrollConfiguration.java @@ -16,6 +16,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class BrightrollConfiguration extends BidderConfiguration { @@ -36,6 +38,9 @@ public class BrightrollConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.brightroll.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps brightrollBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -46,6 +51,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new BrightrollMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/ConversantConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/ConversantConfiguration.java index e0e0826cf20..d3894e1c279 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/ConversantConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/ConversantConfiguration.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class ConversantConfiguration extends BidderConfiguration { @@ -37,6 +39,9 @@ public class ConversantConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.conversant.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps conversantBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -47,6 +52,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new ConversantMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/EplanningConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/EplanningConfiguration.java index 4ca73b842fb..4da89c54c6d 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/EplanningConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/EplanningConfiguration.java @@ -16,6 +16,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class EplanningConfiguration extends BidderConfiguration { @@ -36,11 +38,19 @@ public class EplanningConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.eplanning.deprecated-names:}") + private List deprecatedNames; + @Override protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Bean BidderDeps eplanningBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/FacebookConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/FacebookConfiguration.java index ceb0f08fec4..feab73fcf30 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/FacebookConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/FacebookConfiguration.java @@ -18,6 +18,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class FacebookConfiguration extends BidderConfiguration { @@ -41,6 +43,9 @@ public class FacebookConfiguration extends BidderConfiguration { @Value("${adapters.facebook.platformId:#{null}}") private String platformId; + @Value("${adapters.facebook.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps facebookBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { if (enabled && (usersyncUrl == null || platformId == null)) { @@ -56,6 +61,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new FacebookMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/IndexConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/IndexConfiguration.java index 7d69dcd2341..7c31e8adcda 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/IndexConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/IndexConfiguration.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class IndexConfiguration extends BidderConfiguration { @@ -34,6 +36,9 @@ public class IndexConfiguration extends BidderConfiguration { @Value("${adapters.indexexchange.pbs-enforces-gdpr}") private boolean pbsEnforcesGdpr; + @Value("${adapters.indexexchange.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps indexexchangeBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { if (enabled && endpoint == null) { @@ -49,6 +54,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new IndexMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/LifestreetConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/LifestreetConfiguration.java index be441ffbd13..65ebbf6c125 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/LifestreetConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/LifestreetConfiguration.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class LifestreetConfiguration extends BidderConfiguration { @@ -37,6 +39,9 @@ public class LifestreetConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.lifestreet.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps lifestreetBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -47,6 +52,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new LifestreetMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/OpenxConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/OpenxConfiguration.java index ca3bfc380c4..0608b1ca566 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/OpenxConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/OpenxConfiguration.java @@ -16,6 +16,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class OpenxConfiguration extends BidderConfiguration { @@ -36,6 +38,9 @@ public class OpenxConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.openx.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps openxBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -46,6 +51,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new OpenxMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/PubmaticConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/PubmaticConfiguration.java index 1d2cc1da34b..58298e94467 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/PubmaticConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/PubmaticConfiguration.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class PubmaticConfiguration extends BidderConfiguration { @@ -37,6 +39,9 @@ public class PubmaticConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.pubmatic.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps pubmaticBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -47,6 +52,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new PubmaticMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/PulsepointConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/PulsepointConfiguration.java index 09d76fe1b6e..d5647db46b1 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/PulsepointConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/PulsepointConfiguration.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class PulsepointConfiguration extends BidderConfiguration { @@ -37,6 +39,9 @@ public class PulsepointConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.pulsepoint.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps pulsepointBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -47,6 +52,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new PulsepointMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/RubiconConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/RubiconConfiguration.java index 4ca05555136..4b75200a3d4 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/RubiconConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/RubiconConfiguration.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class RubiconConfiguration extends BidderConfiguration { @@ -40,6 +42,9 @@ public class RubiconConfiguration extends BidderConfiguration { @Value("${adapters.rubicon.XAPI.Password}") private String password; + @Value("${adapters.rubicon.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps rubiconBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -50,6 +55,11 @@ public String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override public MetaInfo createMetaInfo() { return new RubiconMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/SomoaudienceConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/SomoaudienceConfiguration.java index e8a4041faa7..a5827c60d03 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/SomoaudienceConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/SomoaudienceConfiguration.java @@ -16,6 +16,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class SomoaudienceConfiguration extends BidderConfiguration { @@ -36,6 +38,9 @@ public class SomoaudienceConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.somoaudience.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps somoaudienceBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -46,6 +51,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new SomoaudienceMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/spring/config/bidder/SovrnConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/SovrnConfiguration.java index 5c135dc6ee3..b033df2f280 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/SovrnConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/SovrnConfiguration.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class SovrnConfiguration extends BidderConfiguration { @@ -37,6 +39,9 @@ public class SovrnConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.sovrn.deprecated-names:}") + private List deprecatedNames; + @Bean BidderDeps sovrnBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -47,6 +52,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new SovrnMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/java/org/prebid/server/validation/RequestValidator.java b/src/main/java/org/prebid/server/validation/RequestValidator.java index 601bd4abc5e..55a9d533cd1 100644 --- a/src/main/java/org/prebid/server/validation/RequestValidator.java +++ b/src/main/java/org/prebid/server/validation/RequestValidator.java @@ -547,7 +547,7 @@ private void validateImpBidderExtName(int impIndex, Map.Entry throw new ValidationException("request.imp[%d].ext.%s failed validation.\n%s", impIndex, bidderName, messages.stream().collect(Collectors.joining("\n"))); } - } else { + } else if (!bidderCatalog.isDeprecatedName(bidderName)) { throw new ValidationException( "request.imp[%d].ext contains unknown bidder: %s", impIndex, bidderName); } diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index 9b6c7143e79..d892c930a3c 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -85,6 +85,7 @@ import java.util.function.Function; import static java.math.BigDecimal.TEN; +import static java.math.BigDecimal.valueOf; import static java.util.Arrays.asList; import static java.util.Collections.*; import static java.util.function.Function.identity; @@ -198,11 +199,30 @@ public void shouldTolerateImpWithUnknownBidderInExtension() { // then verify(bidderCatalog).isValidName(eq("invalid")); - verifyNoMoreInteractions(bidderCatalog); + verify(bidderCatalog).isDeprecatedName(eq("invalid")); verifyZeroInteractions(bidderRequester); assertThat(bidResponse).isNotNull(); } + @Test + public void shouldProccesRequestAndAddErrorAboutDeprecatedBidder() { + String invalidBidderName = "invalid"; + + given(bidderCatalog.isValidName(invalidBidderName)).willReturn(false); + given(bidderCatalog.isDeprecatedName(invalidBidderName)).willReturn(true); + given(bidderCatalog.getNewNameForDeprecatedBidder(invalidBidderName)).willReturn("valid"); + + final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap(invalidBidderName, 0))); + + final BidResponse bidResponse = exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext).result(); + + Map> errors = new HashMap<>(); + errors.put(invalidBidderName, Collections.singletonList("Bidder invalid has been deprecated and is no longer available. Use valid instead.")); + + assertThat(bidResponse).hasFieldOrPropertyWithValue("ext", + mapper.valueToTree(ExtBidResponse.of(null, errors, new HashMap<>(), null))); + } + @Test public void shouldTolerateMissingPrebidImpExtension() { // given diff --git a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java index 412247a596a..ebadd0fdd20 100644 --- a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java +++ b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java @@ -6,6 +6,8 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; +import java.util.Collections; + import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; @@ -34,7 +36,7 @@ public class BidderCatalogTest { @Test public void isValidNameShouldReturnTrueForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, null, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(), null, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -53,7 +55,7 @@ public void isValidNameShouldReturnFalseForUnknownBidder() { @Test public void metaInfoByNameShouldReturnMetaInfoForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, metaInfo, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(), metaInfo, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -72,7 +74,7 @@ public void metaInfoByNameShouldReturnNullForUnknownBidder() { @Test public void usersyncerByNameShouldReturnUsersyncerForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, null, usersyncer, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(), null, usersyncer, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -91,7 +93,7 @@ public void usersyncerByNameShouldReturnNullForUnknownBidder() { @Test public void bidderByNameShouldReturnBidderForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, null, null, bidder, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(), null, null, bidder, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -110,7 +112,7 @@ public void bidderByNameShouldReturnNullForUnknownBidder() { @Test public void adapterByNameShouldReturnAdapterForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, null, null, null, adapter, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -129,7 +131,7 @@ public void adapterByNameShouldReturnNullForUnknownBidder() { @Test public void bidderRequesterByNameShouldReturnBidderRequesterForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, null, null, null, null, bidderRequester); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(),null, null, null, null, bidderRequester); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -148,7 +150,7 @@ public void bidderRequesterByNameShouldReturnNullForUnknownBidder() { @Test public void isValidAdapterNameShouldReturnTrueIfNameIsValidAndAdapterIsDefined() { // given - bidderDeps = BidderDeps.of(BIDDER, null, null, null, adapter, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isTrue(); @@ -157,7 +159,7 @@ public void isValidAdapterNameShouldReturnTrueIfNameIsValidAndAdapterIsDefined() @Test public void isValidAdapterNameShouldReturnFalseIfNameIsInvalid() { // given - bidderDeps = BidderDeps.of("invalid", null, null, null, adapter, null); + bidderDeps = BidderDeps.of("invalid", Collections.emptyList(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isFalse(); @@ -166,7 +168,7 @@ public void isValidAdapterNameShouldReturnFalseIfNameIsInvalid() { @Test public void isValidAdapterNameShouldReturnFalseIfAdapterIsNotDefined() { // given - bidderDeps = BidderDeps.of(BIDDER, null, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(),null, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isFalse(); diff --git a/src/test/java/org/prebid/server/handler/AuctionHandlerTest.java b/src/test/java/org/prebid/server/handler/AuctionHandlerTest.java index c5a314c4647..fde360340c1 100644 --- a/src/test/java/org/prebid/server/handler/AuctionHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/AuctionHandlerTest.java @@ -58,6 +58,7 @@ import java.time.Instant; import java.time.ZoneId; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/src/test/java/org/prebid/server/handler/CookieSyncHandlerTest.java b/src/test/java/org/prebid/server/handler/CookieSyncHandlerTest.java index a30cba765dc..471e4ff932d 100644 --- a/src/test/java/org/prebid/server/handler/CookieSyncHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/CookieSyncHandlerTest.java @@ -38,6 +38,7 @@ import java.time.Clock; import java.time.Instant; import java.time.ZoneId; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; From 38588294c32df863dc4aefa06a63bc2e5f75e05a Mon Sep 17 00:00:00 2001 From: Dmytro Hutsalo Date: Thu, 25 Oct 2018 13:08:32 +0300 Subject: [PATCH 02/10] review fixes --- .../server/auction/ExchangeService.java | 52 +++++++++++-------- .../prebid/server/bidder/BidderCatalog.java | 15 ++---- .../org/prebid/server/bidder/BidderDeps.java | 4 +- .../config/bidder/BidderConfiguration.java | 11 ++-- .../server/auction/ExchangeServiceTest.java | 4 +- .../server/bidder/BidderCatalogTest.java | 18 +++---- 6 files changed, 55 insertions(+), 49 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 2939d0410be..3bed289245b 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -59,7 +59,6 @@ import org.prebid.server.proto.openrtb.ext.response.ExtResponseCache; import org.prebid.server.proto.openrtb.ext.response.ExtResponseDebug; import org.prebid.server.proto.response.BidderInfo; -import org.prebid.server.spring.config.bidder.BidderConfiguration; import org.prebid.server.validation.ResponseBidValidator; import org.prebid.server.validation.model.ValidationResult; @@ -157,21 +156,13 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo final long startTime = clock.millis(); - final Map> deprecatedBiddersErrors = new HashMap<>(); - // sanity check: discard imps without extension - final List imps = bidRequest.getImp().stream() - .filter(imp -> imp.getExt() != null) - .collect(Collectors.toList()); + final List imps = imps(bidRequest); - // identify valid bidders and aliases out of imps - final List bidders = imps.stream() - .flatMap(imp -> asStream(imp.getExt().fieldNames()) - .filter(bidder -> !Objects.equals(bidder, PREBID_EXT)) - .peek(s -> processDeprecatedBidder(s, deprecatedBiddersErrors)) - .filter(bidder -> isValidBidder(bidder, aliases))) - .distinct() - .collect(Collectors.toList()); + final Map> deprecatedBiddersErrors = new HashMap<>(); + + // identify valid biddersAndErrors and aliases out of imps + final List bidders = biddersAndErrors(imps, deprecatedBiddersErrors, aliases); return extractBidderRequests(bidRequest, imps, bidders, uidsCookie, aliases, timeout) .map(bidderRequests -> @@ -181,7 +172,7 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo auctionTimeout(timeout, cacheInfo.doCaching), aliases, bidAdjustments(requestExt), currencyRates(targeting))) .collect(Collectors.toList()))) - // send all the requests to the bidders and gathers results + // send all the requests to the biddersAndErrors and gathers results .map(CompositeFuture::list) // produce response from bidder results .map(bidderResponses -> updateMetricsFromResponses(bidderResponses, publisherId)) @@ -190,13 +181,21 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo .compose(bidResponse -> bidResponsePostProcessor.postProcess(bidRequest, uidsCookie, bidResponse)); } - private void processDeprecatedBidder(String bidder, Map> deprecatedBiddersErrors) { - if (bidderCatalog.isDeprecatedName(bidder)) { - String newBidderName = bidderCatalog.getNewNameForDeprecatedBidder(bidder); - List errors = new ArrayList<>(); - errors.add(String.format(BidderConfiguration.ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED, bidder, newBidderName)); - deprecatedBiddersErrors.put(bidder, errors); - } + private List imps(BidRequest bidRequest) { + return bidRequest.getImp().stream() + .filter(imp -> imp.getExt() != null) + .collect(Collectors.toList()); + } + + private List biddersAndErrors(List imps, Map> deprecatedBiddersErrors, + Map aliases) { + return imps.stream() + .flatMap(imp -> asStream(imp.getExt().fieldNames()) + .filter(bidder -> !Objects.equals(bidder, PREBID_EXT)) + .peek(s -> processDeprecatedBidder(s, deprecatedBiddersErrors)) + .filter(bidder -> isValidBidder(bidder, aliases))) + .distinct() + .collect(Collectors.toList()); } /** @@ -235,6 +234,13 @@ private static String publisherId(BidRequest bidRequest) { return publisher != null ? publisher.getId() : StringUtils.EMPTY; } + private void processDeprecatedBidder(String bidder, Map> deprecatedBiddersErrors) { + if (bidderCatalog.isDeprecatedName(bidder)) { + deprecatedBiddersErrors.put(bidder, + Collections.singletonList(bidderCatalog.errorForDeprecatedName(bidder))); + } + } + /** * Extracts bidAdjustments from {@link ExtBidRequest}. */ @@ -287,7 +293,7 @@ private Future> extractBidderRequests(BidRequest bidRequest, final ExtUser extUser = extUser(user); final Map uidsBody = uidsFromBody(extUser); - // set empty ext.prebid.buyerids attr to avoid leaking of buyerids across bidders + // set empty ext.prebid.buyerids attr to avoid leaking of buyerids across biddersAndErrors final ObjectNode userExtNode = !uidsBody.isEmpty() && extUser != null ? removeBuyersidsFromUserExtPrebid(extUser) : null; final ExtRegs extRegs = extRegs(bidRequest.getRegs()); diff --git a/src/main/java/org/prebid/server/bidder/BidderCatalog.java b/src/main/java/org/prebid/server/bidder/BidderCatalog.java index 57bb6a0a16e..008dd6b4975 100644 --- a/src/main/java/org/prebid/server/bidder/BidderCatalog.java +++ b/src/main/java/org/prebid/server/bidder/BidderCatalog.java @@ -16,17 +16,12 @@ public class BidderCatalog { private final Map bidderDepsMap; - private final Map deprecatedBidderDepsMap = new HashMap<>(); + private final Map deprecatedNameToError = new HashMap<>(); public BidderCatalog(List bidderDeps) { bidderDepsMap = Objects.requireNonNull(bidderDeps).stream() + .peek(deps -> deprecatedNameToError.putAll(deps.getDeprecatedNameToError())) .collect(Collectors.toMap(BidderDeps::getName, Function.identity())); - - for (BidderDeps bidderDepsInner : bidderDeps) { - for (String deprecatedBidderName : bidderDepsInner.getDeprecatedNames()) { - deprecatedBidderDepsMap.put(deprecatedBidderName, bidderDepsInner); - } - } } /** @@ -44,11 +39,11 @@ public boolean isValidName(String name) { } public boolean isDeprecatedName(String name) { - return deprecatedBidderDepsMap.containsKey(name); + return deprecatedNameToError.containsKey(name); } - public String getNewNameForDeprecatedBidder(String name) { - return deprecatedBidderDepsMap.get(name).getName(); + public String errorForDeprecatedName(String name) { + return deprecatedNameToError.get(name); } /** diff --git a/src/main/java/org/prebid/server/bidder/BidderDeps.java b/src/main/java/org/prebid/server/bidder/BidderDeps.java index b970735500b..cbd6611a044 100644 --- a/src/main/java/org/prebid/server/bidder/BidderDeps.java +++ b/src/main/java/org/prebid/server/bidder/BidderDeps.java @@ -3,7 +3,7 @@ import lombok.AllArgsConstructor; import lombok.Value; -import java.util.List; +import java.util.Map; /** * Gathers all dependencies for bidder. @@ -20,7 +20,7 @@ public class BidderDeps { */ String name; - List deprecatedNames; + Map deprecatedNameToError; /** * Bidder's meta information is used in {@link org.prebid.server.handler.info.BidderDetailsHandler} handler diff --git a/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java index 44a4ffecbd2..26ee360402b 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java @@ -12,6 +12,9 @@ import org.prebid.server.vertx.http.HttpClient; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; public abstract class BidderConfiguration { @@ -19,7 +22,7 @@ public abstract class BidderConfiguration { + "Prebid Server deploy. If you believe this should work, contact the company hosting the service " + "and tell them to check their configuration."; - public static final String ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED = "Bidder %s has been deprecated and is no " + private static final String ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED = "%s has been deprecated and is no " + "longer available. Use %s instead."; protected BidderDeps bidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { @@ -27,7 +30,9 @@ protected BidderDeps bidderDeps(HttpClient httpClient, HttpAdapterConnector http final MetaInfo metaInfo = createMetaInfo(); final boolean enabled = metaInfo.info().isEnabled(); - final List deprecatedNames = deprecatedNames(); + final Map deprecatedNameToError = deprecatedNames().stream() + .collect(Collectors.toMap(Function.identity(), deprecatedName -> String.format( + BidderConfiguration.ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED, deprecatedName, bidderName))); final Usersyncer usersyncer = createUsersyncer(); @@ -40,7 +45,7 @@ protected BidderDeps bidderDeps(HttpClient httpClient, HttpAdapterConnector http final BidderRequester bidderRequester = createBidderRequester(httpClient, bidder, adapter, usersyncer, httpAdapterConnector); - return BidderDeps.of(bidderName, deprecatedNames, metaInfo, usersyncer, bidder, adapter, bidderRequester); + return BidderDeps.of(bidderName, deprecatedNameToError, metaInfo, usersyncer, bidder, adapter, bidderRequester); } protected abstract String bidderName(); diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index d892c930a3c..cae6de4af83 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -210,14 +210,14 @@ public void shouldProccesRequestAndAddErrorAboutDeprecatedBidder() { given(bidderCatalog.isValidName(invalidBidderName)).willReturn(false); given(bidderCatalog.isDeprecatedName(invalidBidderName)).willReturn(true); - given(bidderCatalog.getNewNameForDeprecatedBidder(invalidBidderName)).willReturn("valid"); + given(bidderCatalog.errorForDeprecatedName(invalidBidderName)).willReturn("invalid has been deprecated and is no longer available. Use valid instead."); final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap(invalidBidderName, 0))); final BidResponse bidResponse = exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext).result(); Map> errors = new HashMap<>(); - errors.put(invalidBidderName, Collections.singletonList("Bidder invalid has been deprecated and is no longer available. Use valid instead.")); + errors.put(invalidBidderName, Collections.singletonList("invalid has been deprecated and is no longer available. Use valid instead.")); assertThat(bidResponse).hasFieldOrPropertyWithValue("ext", mapper.valueToTree(ExtBidResponse.of(null, errors, new HashMap<>(), null))); diff --git a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java index ebadd0fdd20..33962d831e0 100644 --- a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java +++ b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java @@ -36,7 +36,7 @@ public class BidderCatalogTest { @Test public void isValidNameShouldReturnTrueForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(), null, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(), null, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -55,7 +55,7 @@ public void isValidNameShouldReturnFalseForUnknownBidder() { @Test public void metaInfoByNameShouldReturnMetaInfoForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(), metaInfo, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(), metaInfo, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -74,7 +74,7 @@ public void metaInfoByNameShouldReturnNullForUnknownBidder() { @Test public void usersyncerByNameShouldReturnUsersyncerForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(), null, usersyncer, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(), null, usersyncer, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -93,7 +93,7 @@ public void usersyncerByNameShouldReturnNullForUnknownBidder() { @Test public void bidderByNameShouldReturnBidderForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(), null, null, bidder, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(), null, null, bidder, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -112,7 +112,7 @@ public void bidderByNameShouldReturnNullForUnknownBidder() { @Test public void adapterByNameShouldReturnAdapterForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(),null, null, null, adapter, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -131,7 +131,7 @@ public void adapterByNameShouldReturnNullForUnknownBidder() { @Test public void bidderRequesterByNameShouldReturnBidderRequesterForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(),null, null, null, null, bidderRequester); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(),null, null, null, null, bidderRequester); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -150,7 +150,7 @@ public void bidderRequesterByNameShouldReturnNullForUnknownBidder() { @Test public void isValidAdapterNameShouldReturnTrueIfNameIsValidAndAdapterIsDefined() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(),null, null, null, adapter, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isTrue(); @@ -159,7 +159,7 @@ public void isValidAdapterNameShouldReturnTrueIfNameIsValidAndAdapterIsDefined() @Test public void isValidAdapterNameShouldReturnFalseIfNameIsInvalid() { // given - bidderDeps = BidderDeps.of("invalid", Collections.emptyList(),null, null, null, adapter, null); + bidderDeps = BidderDeps.of("invalid", Collections.emptyMap(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isFalse(); @@ -168,7 +168,7 @@ public void isValidAdapterNameShouldReturnFalseIfNameIsInvalid() { @Test public void isValidAdapterNameShouldReturnFalseIfAdapterIsNotDefined() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyList(),null, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(),null, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isFalse(); From d5f18e331d645cd76a9878f41faa6dab798747ba Mon Sep 17 00:00:00 2001 From: Dmytro Hutsalo Date: Thu, 25 Oct 2018 16:15:12 +0300 Subject: [PATCH 03/10] review fixes --- .../java/org/prebid/server/auction/ExchangeService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 3bed289245b..b235f8f931f 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -159,10 +159,10 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo // sanity check: discard imps without extension final List imps = imps(bidRequest); - final Map> deprecatedBiddersErrors = new HashMap<>(); + final Map> errors = new HashMap<>(); // identify valid biddersAndErrors and aliases out of imps - final List bidders = biddersAndErrors(imps, deprecatedBiddersErrors, aliases); + final List bidders = biddersAndErrors(imps, errors, aliases); return extractBidderRequests(bidRequest, imps, bidders, uidsCookie, aliases, timeout) .map(bidderRequests -> @@ -172,12 +172,12 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo auctionTimeout(timeout, cacheInfo.doCaching), aliases, bidAdjustments(requestExt), currencyRates(targeting))) .collect(Collectors.toList()))) - // send all the requests to the biddersAndErrors and gathers results + // send all the requests to the bidders and gathers results .map(CompositeFuture::list) // produce response from bidder results .map(bidderResponses -> updateMetricsFromResponses(bidderResponses, publisherId)) .compose(result -> - toBidResponse(result, bidRequest, keywordsCreator, cacheInfo, timeout, deprecatedBiddersErrors)) + toBidResponse(result, bidRequest, keywordsCreator, cacheInfo, timeout, errors)) .compose(bidResponse -> bidResponsePostProcessor.postProcess(bidRequest, uidsCookie, bidResponse)); } From abeb363c787ea824453ca004dbab6f305a91f511 Mon Sep 17 00:00:00 2001 From: Dmytro Hutsalo Date: Thu, 25 Oct 2018 16:21:15 +0300 Subject: [PATCH 04/10] Merge branch 'master' into support-deprecated-bidders --- src/main/java/org/prebid/server/auction/ExchangeService.java | 3 ++- .../java/org/prebid/server/auction/ExchangeServiceTest.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index d41210bed28..53aa66d0995 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -846,7 +846,8 @@ private static MetricName bidderErrorTypeToMetric(BidderError.Type errorType) { */ private Future toBidResponse(List bidderResponses, BidRequest bidRequest, TargetingKeywordsCreator keywordsCreator, BidRequestCacheInfo cacheInfo, - String publisherId, Timeout timeout, Map> deprecatedBiddersErrors) { + String publisherId, Timeout timeout, Map> deprecatedBiddersErrors) { final Set winningBids = newOrEmptySet(keywordsCreator); final Set winningBidsByBidder = newOrEmptySet(keywordsCreator); populateWinningBids(keywordsCreator, bidderResponses, winningBids, winningBidsByBidder); diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index 21b12cb42ec..f0679a3f2ec 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -80,13 +80,13 @@ import java.time.Clock; import java.time.Instant; import java.time.ZoneId; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Function; import static java.math.BigDecimal.TEN; -import static java.math.BigDecimal.valueOf; import static java.util.Arrays.asList; import static java.util.Collections.*; import static java.util.function.Function.identity; From 58aa5419df398581ccdaade4406eb132205574b6 Mon Sep 17 00:00:00 2001 From: Dmytro Hutsalo Date: Fri, 26 Oct 2018 11:15:52 +0300 Subject: [PATCH 05/10] review fixes --- .../config/bidder/AdformConfiguration.java | 2 +- .../bidder/AdtelligentConfiguration.java | 2 +- .../config/bidder/AppnexusConfiguration.java | 2 +- .../bidder/BeachfrontConfiguration.java | 2 +- .../bidder/BrightrollConfiguration.java | 2 +- .../bidder/ConversantConfiguration.java | 2 +- .../config/bidder/EplanningConfiguration.java | 2 +- .../config/bidder/FacebookConfiguration.java | 2 +- .../config/bidder/IndexConfiguration.java | 2 +- .../bidder/LifestreetConfiguration.java | 2 +- .../config/bidder/OpenxConfiguration.java | 2 +- .../config/bidder/PubmaticConfiguration.java | 2 +- .../bidder/PulsepointConfiguration.java | 2 +- .../config/bidder/RubiconConfiguration.java | 2 +- .../bidder/SomoaudienceConfiguration.java | 2 +- .../config/bidder/SovrnConfiguration.java | 2 +- src/main/resources/application.yaml | 16 ++++++++++++++++ .../server/auction/ExchangeServiceTest.java | 14 ++++++++------ .../server/bidder/BidderCatalogTest.java | 19 ++++++++++--------- .../server/handler/AuctionHandlerTest.java | 1 - .../server/handler/CookieSyncHandlerTest.java | 1 - 21 files changed, 50 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/prebid/server/spring/config/bidder/AdformConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/AdformConfiguration.java index 8a342b4ec32..d505c6d193c 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/AdformConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/AdformConfiguration.java @@ -39,7 +39,7 @@ public class AdformConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.adform.deprecated-names:}") + @Value("${adapters.adform.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/AdtelligentConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/AdtelligentConfiguration.java index 589e17ddcc4..e0fe3faccb6 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/AdtelligentConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/AdtelligentConfiguration.java @@ -38,7 +38,7 @@ public class AdtelligentConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.adtelligent.deprecated-names:}") + @Value("${adapters.adtelligent.deprecated-names}") private List deprecatedNames; @Override diff --git a/src/main/java/org/prebid/server/spring/config/bidder/AppnexusConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/AppnexusConfiguration.java index c8d7cc82177..54b8c4e623d 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/AppnexusConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/AppnexusConfiguration.java @@ -39,7 +39,7 @@ public class AppnexusConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.appnexus.deprecated-names:}") + @Value("${adapters.appnexus.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/BeachfrontConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/BeachfrontConfiguration.java index f6eb050bb2d..b1488ab5bb2 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/BeachfrontConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/BeachfrontConfiguration.java @@ -41,7 +41,7 @@ public class BeachfrontConfiguration extends BidderConfiguration { @Value("${adapters.beachfront.pbs-enforces-gdpr}") private boolean pbsEnforcesGdpr; - @Value("${adapters.beachfront.deprecated-names:}") + @Value("${adapters.beachfront.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/BrightrollConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/BrightrollConfiguration.java index ccdbfa9f159..0e537a31495 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/BrightrollConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/BrightrollConfiguration.java @@ -38,7 +38,7 @@ public class BrightrollConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.brightroll.deprecated-names:}") + @Value("${adapters.brightroll.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/ConversantConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/ConversantConfiguration.java index d3894e1c279..ef22f28fa4d 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/ConversantConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/ConversantConfiguration.java @@ -39,7 +39,7 @@ public class ConversantConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.conversant.deprecated-names:}") + @Value("${adapters.conversant.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/EplanningConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/EplanningConfiguration.java index 4da89c54c6d..28b4063d0c4 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/EplanningConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/EplanningConfiguration.java @@ -38,7 +38,7 @@ public class EplanningConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.eplanning.deprecated-names:}") + @Value("${adapters.eplanning.deprecated-names}") private List deprecatedNames; @Override diff --git a/src/main/java/org/prebid/server/spring/config/bidder/FacebookConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/FacebookConfiguration.java index feab73fcf30..9a8c42bd70f 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/FacebookConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/FacebookConfiguration.java @@ -43,7 +43,7 @@ public class FacebookConfiguration extends BidderConfiguration { @Value("${adapters.facebook.platformId:#{null}}") private String platformId; - @Value("${adapters.facebook.deprecated-names:}") + @Value("${adapters.facebook.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/IndexConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/IndexConfiguration.java index 7c31e8adcda..20629c0d2cc 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/IndexConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/IndexConfiguration.java @@ -36,7 +36,7 @@ public class IndexConfiguration extends BidderConfiguration { @Value("${adapters.indexexchange.pbs-enforces-gdpr}") private boolean pbsEnforcesGdpr; - @Value("${adapters.indexexchange.deprecated-names:}") + @Value("${adapters.indexexchange.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/LifestreetConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/LifestreetConfiguration.java index 65ebbf6c125..e720dc8e7bc 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/LifestreetConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/LifestreetConfiguration.java @@ -39,7 +39,7 @@ public class LifestreetConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.lifestreet.deprecated-names:}") + @Value("${adapters.lifestreet.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/OpenxConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/OpenxConfiguration.java index 0608b1ca566..0f62c99ba0e 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/OpenxConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/OpenxConfiguration.java @@ -38,7 +38,7 @@ public class OpenxConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.openx.deprecated-names:}") + @Value("${adapters.openx.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/PubmaticConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/PubmaticConfiguration.java index 58298e94467..40d5926d25a 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/PubmaticConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/PubmaticConfiguration.java @@ -39,7 +39,7 @@ public class PubmaticConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.pubmatic.deprecated-names:}") + @Value("${adapters.pubmatic.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/PulsepointConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/PulsepointConfiguration.java index d5647db46b1..892d24f67e7 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/PulsepointConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/PulsepointConfiguration.java @@ -39,7 +39,7 @@ public class PulsepointConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.pulsepoint.deprecated-names:}") + @Value("${adapters.pulsepoint.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/RubiconConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/RubiconConfiguration.java index 4b75200a3d4..231730ff60b 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/RubiconConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/RubiconConfiguration.java @@ -42,7 +42,7 @@ public class RubiconConfiguration extends BidderConfiguration { @Value("${adapters.rubicon.XAPI.Password}") private String password; - @Value("${adapters.rubicon.deprecated-names:}") + @Value("${adapters.rubicon.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/SomoaudienceConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/SomoaudienceConfiguration.java index a5827c60d03..4ff33abebc7 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/SomoaudienceConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/SomoaudienceConfiguration.java @@ -38,7 +38,7 @@ public class SomoaudienceConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.somoaudience.deprecated-names:}") + @Value("${adapters.somoaudience.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/spring/config/bidder/SovrnConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/SovrnConfiguration.java index b033df2f280..b093fad77b0 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/SovrnConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/SovrnConfiguration.java @@ -39,7 +39,7 @@ public class SovrnConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; - @Value("${adapters.sovrn.deprecated-names:}") + @Value("${adapters.sovrn.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 8d325364f48..51f3ef65ab9 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -38,16 +38,19 @@ adapters: endpoint: http://adx.adform.net/adx usersync-url: //cm.adform.net/cookie?redirect_url= pbs-enforces-gdpr: true + deprecated-names: adtelligent: enabled: false endpoint: http://hb.adtelligent.com/auction usersync-url: //sync.adtelligent.com/csync?t=p&ep=0&redir= pbs-enforces-gdpr: true + deprecated-names: appnexus: enabled: false endpoint: http://ib.adnxs.com/openrtb2 usersync-url: //ib.adnxs.com/getuid? pbs-enforces-gdpr: true + deprecated-names: beachfront: enabled: false banner-endpoint: https://display.bfmio.com/prebid_display @@ -55,65 +58,78 @@ adapters: usersync-url: //sync.bfmio.com/syncb?pid= platform-id: 142 pbs-enforces-gdpr: true + deprecated-names: brightroll: enabled: false endpoint: http://east-bid.ybp.yahoo.com/bid/appnexuspbs usersync-url: http://east-bid.ybp.yahoo.com/sync/appnexuspbs?gdpr={{gdpr}}&euconsent={{gdpr_consent}}&url= pbs-enforces-gdpr: true + deprecated-names: conversant: enabled: false endpoint: http://api.hb.ad.cpe.dotomi.com/s2s/header/24 usersync-url: //prebid-match.dotomi.com/prebid/match?rurl= pbs-enforces-gdpr: true + deprecated-names: eplanning: enabled: false endpoint: http://ads.us.e-planning.net/dsp/obr/1 usersync-url: http://sync.e-planning.net/um?uid pbs-enforces-gdpr: true + deprecated-names: facebook: enabled: false endpoint: https://an.facebook.com/placementbid.ortb nonSecureEndpoint: http://an.facebook.com/placementbid.ortb pbs-enforces-gdpr: true + deprecated-names: indexexchange: enabled: false usersync-url: //ssum-sec.casalemedia.com/usermatchredir?s=184932&cb=https%3A%2F%2Fprebid.adnxs.com%2Fpbs%2Fv1%2Fsetuid%3Fbidder%3DindexExchange%26gdpr%3D{{gdpr}}%26gdpr_consent%3D{{gdpr_consent}}%26uid%3D pbs-enforces-gdpr: true + deprecated-names: lifestreet: enabled: false endpoint: https://prebid.s2s.lfstmedia.com/adrequest usersync-url: //ads.lfstmedia.com/idsync/137062?synced=1&ttl=1s&rurl= pbs-enforces-gdpr: true + deprecated-names: openx: enabled: false endpoint: http://rtb.openx.net/prebid usersync-url: https://rtb.openx.net/sync/prebid?r= pbs-enforces-gdpr: true + deprecated-names: pubmatic: enabled: false endpoint: http://hbopenbid.pubmatic.com/translator?source=prebid-server usersync-url: //ads.pubmatic.com/AdServer/js/user_sync.html?predirect= pbs-enforces-gdpr: true + deprecated-names: pulsepoint: enabled: false endpoint: http://bid.contextweb.com/header/s/ortb/prebid-s2s usersync-url: //bh.contextweb.com/rtset?pid=561205&ev=1&rurl= pbs-enforces-gdpr: true + deprecated-names: rubicon: enabled: false endpoint: http://exapi-us-east.rubiconproject.com/a/api/exchange.json usersync-url: https://pixel.rubiconproject.com/exchange/sync.php?p=prebid&gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}} pbs-enforces-gdpr: true + deprecated-names: somoaudience: enabled: false endpoint: http://publisher-east.mobileadtrading.com/rtb/bid usersync-url: //publisher-east.mobileadtrading.com/usersync?ru= pbs-enforces-gdpr: true + deprecated-names: sovrn: enabled: false endpoint: http://ap.lijit.com/rtb/bid?src=prebid_server usersync-url: //ap.lijit.com/pixel? pbs-enforces-gdpr: true + deprecated-names: metrics: metricType: flushingCounter accounts: diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index f0679a3f2ec..31045319c1f 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -209,8 +209,9 @@ public void shouldTolerateImpWithUnknownBidderInExtension() { } @Test - public void shouldProccesRequestAndAddErrorAboutDeprecatedBidder() { - String invalidBidderName = "invalid"; + public void shouldProcessRequestAndAddErrorAboutDeprecatedBidder() { + //given + final String invalidBidderName = "invalid"; given(bidderCatalog.isValidName(invalidBidderName)).willReturn(false); given(bidderCatalog.isDeprecatedName(invalidBidderName)).willReturn(true); @@ -218,13 +219,14 @@ public void shouldProccesRequestAndAddErrorAboutDeprecatedBidder() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap(invalidBidderName, 0))); + //when final BidResponse bidResponse = exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext).result(); - Map> errors = new HashMap<>(); - errors.put(invalidBidderName, Collections.singletonList("invalid has been deprecated and is no longer available. Use valid instead.")); + //then - assertThat(bidResponse).hasFieldOrPropertyWithValue("ext", - mapper.valueToTree(ExtBidResponse.of(null, errors, new HashMap<>(), null))); + assertThat(bidResponse.getExt()).isEqualTo(mapper.valueToTree(ExtBidResponse.of(null, + Collections.singletonMap(invalidBidderName, Collections.singletonList("invalid has been deprecated and is no longer available. Use valid instead.")), + new HashMap<>(), null))); } @Test diff --git a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java index 33962d831e0..7099a10fd04 100644 --- a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java +++ b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java @@ -9,6 +9,7 @@ import java.util.Collections; import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; @@ -36,7 +37,7 @@ public class BidderCatalogTest { @Test public void isValidNameShouldReturnTrueForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(), null, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyMap(), null, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -55,7 +56,7 @@ public void isValidNameShouldReturnFalseForUnknownBidder() { @Test public void metaInfoByNameShouldReturnMetaInfoForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(), metaInfo, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyMap(), metaInfo, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -74,7 +75,7 @@ public void metaInfoByNameShouldReturnNullForUnknownBidder() { @Test public void usersyncerByNameShouldReturnUsersyncerForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(), null, usersyncer, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyMap(), null, usersyncer, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -93,7 +94,7 @@ public void usersyncerByNameShouldReturnNullForUnknownBidder() { @Test public void bidderByNameShouldReturnBidderForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(), null, null, bidder, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyMap(), null, null, bidder, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -112,7 +113,7 @@ public void bidderByNameShouldReturnNullForUnknownBidder() { @Test public void adapterByNameShouldReturnAdapterForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(),null, null, null, adapter, null); + bidderDeps = BidderDeps.of(BIDDER, emptyMap(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -131,7 +132,7 @@ public void adapterByNameShouldReturnNullForUnknownBidder() { @Test public void bidderRequesterByNameShouldReturnBidderRequesterForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(),null, null, null, null, bidderRequester); + bidderDeps = BidderDeps.of(BIDDER, emptyMap(),null, null, null, null, bidderRequester); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -150,7 +151,7 @@ public void bidderRequesterByNameShouldReturnNullForUnknownBidder() { @Test public void isValidAdapterNameShouldReturnTrueIfNameIsValidAndAdapterIsDefined() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(),null, null, null, adapter, null); + bidderDeps = BidderDeps.of(BIDDER, emptyMap(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isTrue(); @@ -159,7 +160,7 @@ public void isValidAdapterNameShouldReturnTrueIfNameIsValidAndAdapterIsDefined() @Test public void isValidAdapterNameShouldReturnFalseIfNameIsInvalid() { // given - bidderDeps = BidderDeps.of("invalid", Collections.emptyMap(),null, null, null, adapter, null); + bidderDeps = BidderDeps.of("invalid", emptyMap(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isFalse(); @@ -168,7 +169,7 @@ public void isValidAdapterNameShouldReturnFalseIfNameIsInvalid() { @Test public void isValidAdapterNameShouldReturnFalseIfAdapterIsNotDefined() { // given - bidderDeps = BidderDeps.of(BIDDER, Collections.emptyMap(),null, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyMap(),null, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isFalse(); diff --git a/src/test/java/org/prebid/server/handler/AuctionHandlerTest.java b/src/test/java/org/prebid/server/handler/AuctionHandlerTest.java index fde360340c1..c5a314c4647 100644 --- a/src/test/java/org/prebid/server/handler/AuctionHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/AuctionHandlerTest.java @@ -58,7 +58,6 @@ import java.time.Instant; import java.time.ZoneId; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/src/test/java/org/prebid/server/handler/CookieSyncHandlerTest.java b/src/test/java/org/prebid/server/handler/CookieSyncHandlerTest.java index 471e4ff932d..a30cba765dc 100644 --- a/src/test/java/org/prebid/server/handler/CookieSyncHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/CookieSyncHandlerTest.java @@ -38,7 +38,6 @@ import java.time.Clock; import java.time.Instant; import java.time.ZoneId; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; From aaad23ac7e68fa0030285050f44f036c3be648f2 Mon Sep 17 00:00:00 2001 From: Dmytro Hutsalo Date: Mon, 29 Oct 2018 11:29:45 +0200 Subject: [PATCH 06/10] review fixes --- .../server/auction/ExchangeService.java | 67 ++++++++----------- .../prebid/server/bidder/BidderCatalog.java | 11 ++- .../org/prebid/server/bidder/BidderDeps.java | 4 +- .../config/bidder/BidderConfiguration.java | 12 +--- .../server/bidder/BidderCatalogTest.java | 18 ++--- 5 files changed, 51 insertions(+), 61 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 53aa66d0995..7b4959864fd 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -149,15 +149,7 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo final long startTime = clock.millis(); - // sanity check: discard imps without extension - final List imps = imps(bidRequest); - - final Map> errors = new HashMap<>(); - - // identify valid biddersAndErrors and aliases out of imps - final List bidders = biddersAndErrors(imps, errors, aliases); - - return extractBidderRequests(bidRequest, imps, bidders, uidsCookie, aliases, timeout) + return extractBidderRequests(bidRequest, uidsCookie, aliases, timeout) .map(bidderRequests -> updateRequestMetric(bidderRequests, uidsCookie, aliases, publisherId, metricsContext)) .compose(bidderRequests -> CompositeFuture.join(bidderRequests.stream() @@ -170,27 +162,10 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo // produce response from bidder results .map(bidderResponses -> updateMetricsFromResponses(bidderResponses, publisherId)) .compose(result -> - toBidResponse(result, bidRequest, keywordsCreator, cacheInfo, publisherId, timeout, errors)) + toBidResponse(result, bidRequest, keywordsCreator, cacheInfo, publisherId, timeout)) .compose(bidResponse -> bidResponsePostProcessor.postProcess(bidRequest, uidsCookie, bidResponse)); } - private List imps(BidRequest bidRequest) { - return bidRequest.getImp().stream() - .filter(imp -> imp.getExt() != null) - .collect(Collectors.toList()); - } - - private List biddersAndErrors(List imps, Map> deprecatedBiddersErrors, - Map aliases) { - return imps.stream() - .flatMap(imp -> asStream(imp.getExt().fieldNames()) - .filter(bidder -> !Objects.equals(bidder, PREBID_EXT)) - .peek(s -> processDeprecatedBidder(s, deprecatedBiddersErrors)) - .filter(bidder -> isValidBidder(bidder, aliases))) - .distinct() - .collect(Collectors.toList()); - } - /** * Extracts {@link ExtBidRequest} from bid request. */ @@ -278,10 +253,22 @@ private static Map> currencyRates(ExtRequestTarg * NOTE: the return list will only contain entries for bidders that both have the extension field in at least one * {@link Imp}, and are known to {@link BidderCatalog} or aliases from {@link BidRequest}.ext.prebid.aliases. */ - private Future> extractBidderRequests(BidRequest bidRequest, List imps, - List bidders, UidsCookie uidsCookie, + private Future> extractBidderRequests(BidRequest bidRequest, UidsCookie uidsCookie, Map aliases, Timeout timeout) { + // sanity check: discard imps without extension + final List imps = bidRequest.getImp().stream() + .filter(imp -> imp.getExt() != null) + .collect(Collectors.toList()); + + // identify valid bidders and aliases out of imps + final List bidders = imps.stream() + .flatMap(imp -> asStream(imp.getExt().fieldNames()) + .filter(bidder -> !Objects.equals(bidder, PREBID_EXT)) + .filter(bidder -> isValidBidder(bidder, aliases))) + .distinct() + .collect(Collectors.toList()); + final User user = bidRequest.getUser(); final ExtUser extUser = extUser(user); final Map uidsBody = uidsFromBody(extUser); @@ -846,8 +833,7 @@ private static MetricName bidderErrorTypeToMetric(BidderError.Type errorType) { */ private Future toBidResponse(List bidderResponses, BidRequest bidRequest, TargetingKeywordsCreator keywordsCreator, BidRequestCacheInfo cacheInfo, - String publisherId, Timeout timeout, Map> deprecatedBiddersErrors) { + String publisherId, Timeout timeout) { final Set winningBids = newOrEmptySet(keywordsCreator); final Set winningBidsByBidder = newOrEmptySet(keywordsCreator); populateWinningBids(keywordsCreator, bidderResponses, winningBids, winningBidsByBidder); @@ -855,8 +841,7 @@ private Future toBidResponse(List bidderResponses, return toWinningBidsWithCacheIds(winningBids, bidRequest.getImp(), keywordsCreator, cacheInfo, publisherId, timeout) .map(winningBidsWithCacheIds -> toBidResponseWithCacheInfo(bidderResponses, bidRequest, keywordsCreator, - winningBidsWithCacheIds, winningBidsByBidder, cacheInfo, - deprecatedBiddersErrors)); + winningBidsWithCacheIds, winningBidsByBidder, cacheInfo)); } /** @@ -994,8 +979,7 @@ private static Map toMapBidsWithEmptyCacheIds(Set bids) { private BidResponse toBidResponseWithCacheInfo(List bidderResponses, BidRequest bidRequest, TargetingKeywordsCreator keywordsCreator, Map winningBidsWithCacheIds, - Set winningBidsByBidder, BidRequestCacheInfo cacheInfo, - Map> deprecatedBiddersErrors) { + Set winningBidsByBidder, BidRequestCacheInfo cacheInfo) { final List seatBids = bidderResponses.stream() .filter(bidderResponse -> !bidderResponse.getSeatBid().getBids().isEmpty()) .map(bidderResponse -> @@ -1003,7 +987,7 @@ private BidResponse toBidResponseWithCacheInfo(List bidderRespon cacheInfo)) .collect(Collectors.toList()); - final ExtBidResponse bidResponseExt = toExtBidResponse(bidderResponses, bidRequest, deprecatedBiddersErrors); + final ExtBidResponse bidResponseExt = toExtBidResponse(bidderResponses, bidRequest); return BidResponse.builder() .id(bidRequest.getId()) @@ -1087,8 +1071,7 @@ private CacheAsset toCacheAsset(String cacheId) { * Creates {@link ExtBidResponse} populated with response time, errors and debug info (if requested) from all * bidders */ - private static ExtBidResponse toExtBidResponse(List results, BidRequest bidRequest, - Map> deprecatedBiddersErrors) { + private ExtBidResponse toExtBidResponse(List results, BidRequest bidRequest) { final Map> httpCalls = Objects.equals(bidRequest.getTest(), 1) ? results.stream().collect( Collectors.toMap(BidderResponse::getBidder, r -> ListUtils.emptyIfNull(r.getSeatBid().getHttpCalls()))) @@ -1098,6 +1081,14 @@ private static ExtBidResponse toExtBidResponse(List results, Bid final Map> errors = results.stream() .collect(Collectors.toMap(BidderResponse::getBidder, r -> messages(r.getSeatBid().getErrors()))); + Map> deprecatedBiddersErrors = bidRequest.getImp().stream() + .filter(imp -> imp.getExt() != null) + .flatMap(imp -> asStream(imp.getExt().fieldNames())) + .distinct() + .filter(bidderCatalog::isDeprecatedName) + .collect(Collectors.toMap(Function.identity(), + bidder -> Collections.singletonList(bidderCatalog.errorForDeprecatedName(bidder)))); + errors.putAll(deprecatedBiddersErrors); final Map responseTimeMillis = results.stream() diff --git a/src/main/java/org/prebid/server/bidder/BidderCatalog.java b/src/main/java/org/prebid/server/bidder/BidderCatalog.java index 008dd6b4975..2d135909fef 100644 --- a/src/main/java/org/prebid/server/bidder/BidderCatalog.java +++ b/src/main/java/org/prebid/server/bidder/BidderCatalog.java @@ -14,13 +14,17 @@ */ public class BidderCatalog { + private static final String ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED = "%s has been deprecated and is no " + + "longer available. Use %s instead."; + private final Map bidderDepsMap; private final Map deprecatedNameToError = new HashMap<>(); public BidderCatalog(List bidderDeps) { bidderDepsMap = Objects.requireNonNull(bidderDeps).stream() - .peek(deps -> deprecatedNameToError.putAll(deps.getDeprecatedNameToError())) + .peek(deps -> deprecatedNameToError.putAll( + createErrorsForDeprecatedNames(deps.getDeprecatedNames(), deps.getName()))) .collect(Collectors.toMap(BidderDeps::getName, Function.identity())); } @@ -46,6 +50,11 @@ public String errorForDeprecatedName(String name) { return deprecatedNameToError.get(name); } + private Map createErrorsForDeprecatedNames(List deprecatedNames, String name) { + return deprecatedNames.stream().collect(Collectors.toMap(deprecatedName -> deprecatedName, + deprecatedName -> String.format(ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED, deprecatedName, name))); + } + /** * Tells if given bidder is enabled and ready for auction. */ diff --git a/src/main/java/org/prebid/server/bidder/BidderDeps.java b/src/main/java/org/prebid/server/bidder/BidderDeps.java index cbd6611a044..b970735500b 100644 --- a/src/main/java/org/prebid/server/bidder/BidderDeps.java +++ b/src/main/java/org/prebid/server/bidder/BidderDeps.java @@ -3,7 +3,7 @@ import lombok.AllArgsConstructor; import lombok.Value; -import java.util.Map; +import java.util.List; /** * Gathers all dependencies for bidder. @@ -20,7 +20,7 @@ public class BidderDeps { */ String name; - Map deprecatedNameToError; + List deprecatedNames; /** * Bidder's meta information is used in {@link org.prebid.server.handler.info.BidderDetailsHandler} handler diff --git a/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java index 26ee360402b..f5de7def303 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/BidderConfiguration.java @@ -12,9 +12,6 @@ import org.prebid.server.vertx.http.HttpClient; import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; public abstract class BidderConfiguration { @@ -22,18 +19,11 @@ public abstract class BidderConfiguration { + "Prebid Server deploy. If you believe this should work, contact the company hosting the service " + "and tell them to check their configuration."; - private static final String ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED = "%s has been deprecated and is no " - + "longer available. Use %s instead."; - protected BidderDeps bidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { final String bidderName = bidderName(); final MetaInfo metaInfo = createMetaInfo(); final boolean enabled = metaInfo.info().isEnabled(); - final Map deprecatedNameToError = deprecatedNames().stream() - .collect(Collectors.toMap(Function.identity(), deprecatedName -> String.format( - BidderConfiguration.ERROR_MESSAGE_TEMPLATE_FOR_DEPRECATED, deprecatedName, bidderName))); - final Usersyncer usersyncer = createUsersyncer(); final Bidder bidder = enabled ? createBidder(metaInfo) @@ -45,7 +35,7 @@ protected BidderDeps bidderDeps(HttpClient httpClient, HttpAdapterConnector http final BidderRequester bidderRequester = createBidderRequester(httpClient, bidder, adapter, usersyncer, httpAdapterConnector); - return BidderDeps.of(bidderName, deprecatedNameToError, metaInfo, usersyncer, bidder, adapter, bidderRequester); + return BidderDeps.of(bidderName, deprecatedNames(), metaInfo, usersyncer, bidder, adapter, bidderRequester); } protected abstract String bidderName(); diff --git a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java index 7099a10fd04..d6a45b41145 100644 --- a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java +++ b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java @@ -37,7 +37,7 @@ public class BidderCatalogTest { @Test public void isValidNameShouldReturnTrueForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, emptyMap(), null, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyList(), null, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -56,7 +56,7 @@ public void isValidNameShouldReturnFalseForUnknownBidder() { @Test public void metaInfoByNameShouldReturnMetaInfoForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, emptyMap(), metaInfo, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyList(), metaInfo, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -75,7 +75,7 @@ public void metaInfoByNameShouldReturnNullForUnknownBidder() { @Test public void usersyncerByNameShouldReturnUsersyncerForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, emptyMap(), null, usersyncer, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyList(), null, usersyncer, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -94,7 +94,7 @@ public void usersyncerByNameShouldReturnNullForUnknownBidder() { @Test public void bidderByNameShouldReturnBidderForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, emptyMap(), null, null, bidder, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyList(), null, null, bidder, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -113,7 +113,7 @@ public void bidderByNameShouldReturnNullForUnknownBidder() { @Test public void adapterByNameShouldReturnAdapterForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, emptyMap(),null, null, null, adapter, null); + bidderDeps = BidderDeps.of(BIDDER, emptyList(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -132,7 +132,7 @@ public void adapterByNameShouldReturnNullForUnknownBidder() { @Test public void bidderRequesterByNameShouldReturnBidderRequesterForKnownBidder() { // given - bidderDeps = BidderDeps.of(BIDDER, emptyMap(),null, null, null, null, bidderRequester); + bidderDeps = BidderDeps.of(BIDDER, emptyList(),null, null, null, null, bidderRequester); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then @@ -151,7 +151,7 @@ public void bidderRequesterByNameShouldReturnNullForUnknownBidder() { @Test public void isValidAdapterNameShouldReturnTrueIfNameIsValidAndAdapterIsDefined() { // given - bidderDeps = BidderDeps.of(BIDDER, emptyMap(),null, null, null, adapter, null); + bidderDeps = BidderDeps.of(BIDDER, emptyList(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isTrue(); @@ -160,7 +160,7 @@ public void isValidAdapterNameShouldReturnTrueIfNameIsValidAndAdapterIsDefined() @Test public void isValidAdapterNameShouldReturnFalseIfNameIsInvalid() { // given - bidderDeps = BidderDeps.of("invalid", emptyMap(),null, null, null, adapter, null); + bidderDeps = BidderDeps.of("invalid", emptyList(),null, null, null, adapter, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isFalse(); @@ -169,7 +169,7 @@ public void isValidAdapterNameShouldReturnFalseIfNameIsInvalid() { @Test public void isValidAdapterNameShouldReturnFalseIfAdapterIsNotDefined() { // given - bidderDeps = BidderDeps.of(BIDDER, emptyMap(),null, null, null, null, null); + bidderDeps = BidderDeps.of(BIDDER, emptyList(),null, null, null, null, null); bidderCatalog = new BidderCatalog(singletonList(bidderDeps)); // when and then assertThat(bidderCatalog.isValidAdapterName(BIDDER)).isFalse(); From 9efd95350de540a955d13bfa3136fb183d31f0bc Mon Sep 17 00:00:00 2001 From: Dmytro Hutsalo Date: Mon, 29 Oct 2018 12:22:35 +0200 Subject: [PATCH 07/10] review fixes --- .../org/prebid/server/auction/ExchangeService.java | 11 ++--------- .../prebid/server/auction/ExchangeServiceTest.java | 1 - 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 96cf08b355b..e5e21a009dc 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -202,13 +202,6 @@ private static String publisherId(BidRequest bidRequest) { return publisher != null ? publisher.getId() : StringUtils.EMPTY; } - private void processDeprecatedBidder(String bidder, Map> deprecatedBiddersErrors) { - if (bidderCatalog.isDeprecatedName(bidder)) { - deprecatedBiddersErrors.put(bidder, - Collections.singletonList(bidderCatalog.errorForDeprecatedName(bidder))); - } - } - /** * Extracts bidAdjustments from {@link ExtBidRequest}. */ @@ -273,7 +266,7 @@ private Future> extractBidderRequests(BidRequest bidRequest, final ExtUser extUser = extUser(user); final Map uidsBody = uidsFromBody(extUser); - // set empty ext.prebid.buyerids attr to avoid leaking of buyerids across biddersAndErrors + // set empty ext.prebid.buyerids attr to avoid leaking of buyerids across bidders final ObjectNode userExtNode = !uidsBody.isEmpty() && extUser != null ? removeBuyersidsFromUserExtPrebid(extUser) : null; final ExtRegs extRegs = extRegs(bidRequest.getRegs()); @@ -1081,7 +1074,7 @@ private ExtBidResponse toExtBidResponse(List results, BidRequest final Map> errors = results.stream() .collect(Collectors.toMap(BidderResponse::getBidder, r -> messages(r.getSeatBid().getErrors()))); - Map> deprecatedBiddersErrors = bidRequest.getImp().stream() + final Map> deprecatedBiddersErrors = bidRequest.getImp().stream() .filter(imp -> imp.getExt() != null) .flatMap(imp -> asStream(imp.getExt().fieldNames())) .distinct() diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index 31045319c1f..53b09d54d25 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -223,7 +223,6 @@ public void shouldProcessRequestAndAddErrorAboutDeprecatedBidder() { final BidResponse bidResponse = exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext).result(); //then - assertThat(bidResponse.getExt()).isEqualTo(mapper.valueToTree(ExtBidResponse.of(null, Collections.singletonMap(invalidBidderName, Collections.singletonList("invalid has been deprecated and is no longer available. Use valid instead.")), new HashMap<>(), null))); From bfc32d727b09486b5f7b077311f689390ac24f7c Mon Sep 17 00:00:00 2001 From: Dmytro Hutsalo Date: Mon, 29 Oct 2018 19:01:49 +0200 Subject: [PATCH 08/10] review changes --- .../server/auction/ExchangeService.java | 24 ++++++++++++------- .../prebid/server/bidder/BidderCatalog.java | 7 ++++-- .../spring/config/bidder/IxConfiguration.java | 2 +- .../server/validation/RequestValidator.java | 2 +- .../openrtb2/test-auction-response.json | 8 +++---- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index e5e21a009dc..fbf86671279 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -1071,16 +1071,12 @@ private ExtBidResponse toExtBidResponse(List results, BidRequest : null; final ExtResponseDebug extResponseDebug = httpCalls != null ? ExtResponseDebug.of(httpCalls, bidRequest) : null; - final Map> errors = results.stream() - .collect(Collectors.toMap(BidderResponse::getBidder, r -> messages(r.getSeatBid().getErrors()))); + final Map> errors = new HashMap<>(); + for (BidderResponse bidderResponse : results) { + errors.put(bidderResponse.getBidder(), messages(bidderResponse.getSeatBid().getErrors())); + } - final Map> deprecatedBiddersErrors = bidRequest.getImp().stream() - .filter(imp -> imp.getExt() != null) - .flatMap(imp -> asStream(imp.getExt().fieldNames())) - .distinct() - .filter(bidderCatalog::isDeprecatedName) - .collect(Collectors.toMap(Function.identity(), - bidder -> Collections.singletonList(bidderCatalog.errorForDeprecatedName(bidder)))); + final Map> deprecatedBiddersErrors = extractDeprecatedBiddersErrors(bidRequest); errors.putAll(deprecatedBiddersErrors); @@ -1090,6 +1086,16 @@ private ExtBidResponse toExtBidResponse(List results, BidRequest return ExtBidResponse.of(extResponseDebug, errors, responseTimeMillis, null); } + private Map> extractDeprecatedBiddersErrors(BidRequest bidRequest) { + return bidRequest.getImp().stream() + .filter(imp -> imp.getExt() != null) + .flatMap(imp -> asStream(imp.getExt().fieldNames())) + .distinct() + .filter(bidderCatalog::isDeprecatedName) + .collect(Collectors.toMap(Function.identity(), + bidder -> Collections.singletonList(bidderCatalog.errorForDeprecatedName(bidder)))); + } + private static List messages(List errors) { return CollectionUtils.emptyIfNull(errors).stream().map(BidderError::getMessage).collect(Collectors.toList()); } diff --git a/src/main/java/org/prebid/server/bidder/BidderCatalog.java b/src/main/java/org/prebid/server/bidder/BidderCatalog.java index 2d135909fef..91e0e4f5f2f 100644 --- a/src/main/java/org/prebid/server/bidder/BidderCatalog.java +++ b/src/main/java/org/prebid/server/bidder/BidderCatalog.java @@ -23,9 +23,12 @@ public class BidderCatalog { public BidderCatalog(List bidderDeps) { bidderDepsMap = Objects.requireNonNull(bidderDeps).stream() - .peek(deps -> deprecatedNameToError.putAll( - createErrorsForDeprecatedNames(deps.getDeprecatedNames(), deps.getName()))) .collect(Collectors.toMap(BidderDeps::getName, Function.identity())); + + Objects.requireNonNull(bidderDeps).forEach(deps -> + deprecatedNameToError.putAll(createErrorsForDeprecatedNames(deps.getDeprecatedNames(), + deps.getName()))); + } /** diff --git a/src/main/java/org/prebid/server/spring/config/bidder/IxConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/IxConfiguration.java index e5b84bf0708..def29f431a7 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/IxConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/IxConfiguration.java @@ -36,7 +36,7 @@ public class IxConfiguration extends BidderConfiguration { @Value("${adapters.ix.pbs-enforces-gdpr}") private boolean pbsEnforcesGdpr; - @Value("${adapters.indexexchange.deprecated-names}") + @Value("${adapters.ix.deprecated-names}") private List deprecatedNames; @Bean diff --git a/src/main/java/org/prebid/server/validation/RequestValidator.java b/src/main/java/org/prebid/server/validation/RequestValidator.java index 55a9d533cd1..f6b1068eaf7 100644 --- a/src/main/java/org/prebid/server/validation/RequestValidator.java +++ b/src/main/java/org/prebid/server/validation/RequestValidator.java @@ -400,7 +400,7 @@ private List validateAndGetUpdatedNativeAssets(List assets, int im private void validateNativeAsset(Asset asset, int impIndex, int assetIndex) throws ValidationException { if (asset.getId() != null) { throw new ValidationException("request.imp[%d].native.request.assets[%d].id must not be defined. Prebid" - + " Server will set this automatically, using the index of the asset in the array as the ID.", + + " Server will set this automatically, using the ix of the asset in the array as the ID.", impIndex, assetIndex); } diff --git a/src/test/resources/org/prebid/server/ApplicationTest/openrtb2/test-auction-response.json b/src/test/resources/org/prebid/server/ApplicationTest/openrtb2/test-auction-response.json index dd1f02d4db9..c0e460b5022 100644 --- a/src/test/resources/org/prebid/server/ApplicationTest/openrtb2/test-auction-response.json +++ b/src/test/resources/org/prebid/server/ApplicationTest/openrtb2/test-auction-response.json @@ -244,7 +244,7 @@ "cache": { "bids": { "url": "http://localhost:8090/cache?uuid=3ed36e9a-c27b-4d68-a82e-536fbf8fd6c1", - "cache_id": "3ed36e9a-c27b-4d68-a82e-536fbf8fd6c1" + "cacheId": "3ed36e9a-c27b-4d68-a82e-536fbf8fd6c1" } } } @@ -278,13 +278,13 @@ "hb_deal": "dealId61" }, "cache": { - "vast_xml": { + "vastXml": { "url": "http://localhost:8090/cache?uuid=5437cd87-de4f-4981-84fa-7baceb1f3685", - "cache_id": "5437cd87-de4f-4981-84fa-7baceb1f3685" + "cacheId": "5437cd87-de4f-4981-84fa-7baceb1f3685" }, "bids": { "url": "http://localhost:8090/cache?uuid=969172e8-1699-4235-a2a6-31cab4647a32", - "cache_id": "969172e8-1699-4235-a2a6-31cab4647a32" + "cacheId": "969172e8-1699-4235-a2a6-31cab4647a32" } } } From 619f9ba95ca6e921f813e771d451b40fd9cc4195 Mon Sep 17 00:00:00 2001 From: Dmytro Hutsalo Date: Tue, 30 Oct 2018 16:07:57 +0200 Subject: [PATCH 09/10] review changes --- src/main/java/org/prebid/server/auction/ExchangeService.java | 4 +--- src/main/java/org/prebid/server/bidder/BidderCatalog.java | 3 +-- .../java/org/prebid/server/validation/RequestValidator.java | 2 +- .../org/prebid/server/validation/RequestValidatorTest.java | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index fbf86671279..b67374dd0ba 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -1076,9 +1076,7 @@ private ExtBidResponse toExtBidResponse(List results, BidRequest errors.put(bidderResponse.getBidder(), messages(bidderResponse.getSeatBid().getErrors())); } - final Map> deprecatedBiddersErrors = extractDeprecatedBiddersErrors(bidRequest); - - errors.putAll(deprecatedBiddersErrors); + errors.putAll(extractDeprecatedBiddersErrors(bidRequest)); final Map responseTimeMillis = results.stream() .collect(Collectors.toMap(BidderResponse::getBidder, BidderResponse::getResponseTime)); diff --git a/src/main/java/org/prebid/server/bidder/BidderCatalog.java b/src/main/java/org/prebid/server/bidder/BidderCatalog.java index 91e0e4f5f2f..febc1e2dc24 100644 --- a/src/main/java/org/prebid/server/bidder/BidderCatalog.java +++ b/src/main/java/org/prebid/server/bidder/BidderCatalog.java @@ -25,10 +25,9 @@ public BidderCatalog(List bidderDeps) { bidderDepsMap = Objects.requireNonNull(bidderDeps).stream() .collect(Collectors.toMap(BidderDeps::getName, Function.identity())); - Objects.requireNonNull(bidderDeps).forEach(deps -> + bidderDeps.forEach(deps -> deprecatedNameToError.putAll(createErrorsForDeprecatedNames(deps.getDeprecatedNames(), deps.getName()))); - } /** diff --git a/src/main/java/org/prebid/server/validation/RequestValidator.java b/src/main/java/org/prebid/server/validation/RequestValidator.java index f6b1068eaf7..55a9d533cd1 100644 --- a/src/main/java/org/prebid/server/validation/RequestValidator.java +++ b/src/main/java/org/prebid/server/validation/RequestValidator.java @@ -400,7 +400,7 @@ private List validateAndGetUpdatedNativeAssets(List assets, int im private void validateNativeAsset(Asset asset, int impIndex, int assetIndex) throws ValidationException { if (asset.getId() != null) { throw new ValidationException("request.imp[%d].native.request.assets[%d].id must not be defined. Prebid" - + " Server will set this automatically, using the ix of the asset in the array as the ID.", + + " Server will set this automatically, using the index of the asset in the array as the ID.", impIndex, assetIndex); } diff --git a/src/test/java/org/prebid/server/validation/RequestValidatorTest.java b/src/test/java/org/prebid/server/validation/RequestValidatorTest.java index 1b53589f014..8e1b07f36cb 100644 --- a/src/test/java/org/prebid/server/validation/RequestValidatorTest.java +++ b/src/test/java/org/prebid/server/validation/RequestValidatorTest.java @@ -1168,7 +1168,7 @@ public void validateShouldReturnValidationResultWithErrorWhenElementInAssetsHasI // then assertThat(result.getErrors()).hasSize(1) .containsOnly("request.imp[0].native.request.assets[0].id must not be defined. Prebid Server will" - + " set this automatically, using the ix of the asset in the array as the ID."); + + " set this automatically, using the index of the asset in the array as the ID."); } @Test From 9c1b18c6a890073a68fab74f29afadf99f023a22 Mon Sep 17 00:00:00 2001 From: Ruslan Panchyk Date: Tue, 30 Oct 2018 18:04:18 +0200 Subject: [PATCH 10/10] Fix AdkernelAdn bidder configuration - add deprecated-names --- .../spring/config/bidder/AdkernelAdnConfiguration.java | 10 ++++++++++ src/main/resources/application.yaml | 1 + 2 files changed, 11 insertions(+) diff --git a/src/main/java/org/prebid/server/spring/config/bidder/AdkernelAdnConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/AdkernelAdnConfiguration.java index 9524d66222c..0c905a1f870 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/AdkernelAdnConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/AdkernelAdnConfiguration.java @@ -16,6 +16,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class AdkernelAdnConfiguration extends BidderConfiguration { @@ -36,6 +38,9 @@ public class AdkernelAdnConfiguration extends BidderConfiguration { @Value("${external-url}") private String externalUrl; + @Value("${adapters.adkerneladn.deprecated-names}") + private List deprecatedNames; + @Bean BidderDeps adkernelAdnBidderDeps(HttpClient httpClient, HttpAdapterConnector httpAdapterConnector) { return bidderDeps(httpClient, httpAdapterConnector); @@ -46,6 +51,11 @@ protected String bidderName() { return BIDDER_NAME; } + @Override + protected List deprecatedNames() { + return deprecatedNames; + } + @Override protected MetaInfo createMetaInfo() { return new AdkernelAdnMetaInfo(enabled, pbsEnforcesGdpr); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 014a370ec1d..58ec9812b9c 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -44,6 +44,7 @@ adapters: endpoint: http://tag.adkernel.com/rtbpub?account= usersync-url: https://tag.adkernel.com/syncr?gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&r= pbs-enforces-gdpr: true + deprecated-names: adtelligent: enabled: false endpoint: http://hb.adtelligent.com/auction