Java源码示例:com.google.openrtb.OpenRtb.BidResponse.SeatBid
示例1
public GoogleBidResponse(JsonNode root) {
if (root != null) {
builder = OpenRtb.BidResponse.newBuilder();
builder.setId(root.path("id").textValue());
builder.setBidid(root.path("id").textValue());
builder.setCur(root.path("cur").textValue());
ArrayNode seatBids = (ArrayNode) root.path("seatbid");
for (int i = 0; i < seatBids.size(); i++) {
JsonNode seatBid = seatBids.get(i);
ArrayNode bids = (ArrayNode) seatBid.path("bid");
OpenRtb.BidResponse.SeatBid.Builder seatBidBuilder = OpenRtb.BidResponse.SeatBid.newBuilder();
for (int j = 0; j < bids.size(); j++) {
JsonNode bid = bids.get(j);
seatBidBuilder.addBid(j, constructBid(bid));
}
seatBidBuilder.setSeat("google-id");
builder.addSeatbid(i, seatBidBuilder.build());
}
internal = builder.build();
byte[] bytes = internal.toByteArray();
protobuf = new String(Base64.encodeBase64(bytes));
}
}
示例2
protected void readSeatBidField(JsonParser par, SeatBid.Builder seatbid, String fieldName)
throws IOException {
switch (fieldName) {
case "bid":
for (startArray(par); endArray(par); par.nextToken()) {
seatbid.addBid(readBid(par));
}
break;
case "seat":
seatbid.setSeat(par.getText());
break;
case "group":
seatbid.setGroup(par.getValueAsBoolean());
break;
default:
readOther(seatbid, par, fieldName);
}
}
示例3
protected void writeBidResponseFields(BidResponse resp, JsonGenerator gen) throws IOException {
gen.writeStringField("id", resp.getId());
if (resp.getSeatbidCount() != 0) {
gen.writeArrayFieldStart("seatbid");
for (SeatBid seatbid : resp.getSeatbidList()) {
writeSeatBid(seatbid, gen);
}
gen.writeEndArray();
}
if (resp.hasBidid()) {
gen.writeStringField("bidid", resp.getBidid());
}
if (resp.hasCur()) {
gen.writeStringField("cur", resp.getCur());
}
if (resp.hasCustomdata()) {
gen.writeStringField("customdata", resp.getCustomdata());
}
if (resp.hasNbr()) {
writeEnumField("nbr", resp.getNbr(), gen);
}
}
示例4
/**
* Finds a bid by seat and ID.
*
* @param seatFilter Filter for seatFilter. You can use {@code null} to select the anonymous seat,
* or {@link #SEAT_ANY} to not filter by seat
* @param id Bid ID, assumed to be unique within the filtered seats
* @return Matching bid's builder, or {@code null} if not found
*/
@Nullable public static Bid.Builder bidWithId(
BidResponse.Builder response, @Nullable String seatFilter, String id) {
checkNotNull(id);
for (SeatBid.Builder seatbid : response.getSeatbidBuilderList()) {
if (filterSeat(seatbid, seatFilter)) {
for (Bid.Builder bid : seatbid.getBidBuilderList()) {
if (id.equals(bid.getId())) {
return bid;
}
}
return null;
}
}
return null;
}
示例5
static OpenRtbJsonFactory registerBidResponseExt(OpenRtbJsonFactory factory) {
return factory
// Readers
.register(new Test1Reader<>(TestExt.testResponse1), BidResponse.Builder.class)
.register(new Test2Reader<>(TestExt.testResponse2, "test2arr"), BidResponse.Builder.class)
.register(new Test2Reader<>(TestExt.testResponse2A, "test2a"), BidResponse.Builder.class)
.register(new Test2Reader<>(TestExt.testResponse2B, "test2b"), BidResponse.Builder.class)
.register(new Test3Reader(), BidResponse.Builder.class)
.register(new Test4Reader(), BidResponse.Builder.class)
.register(new Test1Reader<>(TestExt.testSeat), SeatBid.Builder.class)
.register(new Test1Reader<>(TestExt.testBid), SeatBid.Bid.Builder.class)
// Writers
.register(new Test1Writer(), Test.Test1.class, BidResponse.class, "testResponse1")
.register(new Test2Writer("test2arr"), Test.Test2.class, BidResponse.class, "testResponse2")
.register(new Test2Writer("test2a"), Test.Test2.class, BidResponse.class, "testResponse2a")
.register(new Test2Writer("test2b"), Test.Test2.class, BidResponse.class, "testResponse2b")
.register(new Test3Writer(), Integer.class, BidResponse.class, "testResponse3")
.register(new Test4Writer(), Integer.class, BidResponse.class, "testResponse4")
.register(new Test1Writer(), Test.Test1.class, SeatBid.class)
.register(new Test1Writer(), Test.Test1.class, SeatBid.Bid.class);
}
示例6
private static BidResponse.Builder createBidResponse(String snippet, boolean full) {
Bid.Builder bid = Bid.newBuilder()
.setId("bid1")
.setImpid("1")
.setPrice(1000);
if (full) {
bid
.setAdid("ad1")
.setAdm(snippet)
.setIurl("https://mycontent.com/creative.png");
}
return BidResponse.newBuilder()
.setId("1")
.addSeatbid(SeatBid.newBuilder()
.setSeat("seat1")
.addBid(bid));
}
示例7
@Test
public void testNoData() {
BidRequest request = BidRequest.newBuilder()
.setId("req1")
.addImp(Imp.newBuilder()
.setId("imp1")
.setBanner(Banner.newBuilder()))
.build();
Bid.Builder bid = Bid.newBuilder()
.setId("bid1")
.setImpid("imp1")
.setAdm(
OpenRtbMacros.AUCTION_AD_ID.key()
+ OpenRtbMacros.AUCTION_BID_ID.key()
+ OpenRtbMacros.AUCTION_CURRENCY.key()
+ OpenRtbMacros.AUCTION_SEAT_ID.key())
.setPrice(10000);
BidResponse.Builder resp = BidResponse.newBuilder()
.addSeatbid(SeatBid.newBuilder().addBid(bid));
OpenRtbSnippetProcessor processor = new OpenRtbSnippetProcessor(true);
processor.process(new SnippetProcessorContext(request, resp));
bid = resp.getSeatbidBuilder(0).getBidBuilder(0);
assertThat(bid.getAdm()).isEmpty();
}
示例8
@Test
public void testResponse_remove() {
BidResponse.Builder response = BidResponse.newBuilder()
.addSeatbid(SeatBid.newBuilder()
.addBid(buildHtmlBid("1", 100))
.addBid(buildHtmlBid("2", 100))
.addBid(buildHtmlBid("3", 200)))
.addSeatbid(SeatBid.newBuilder().setSeat("unused"));
OpenRtbUtils.removeBids(response, bid -> true);
assertThat(OpenRtbUtils.bids(response)).hasSize(3);
assertThat(OpenRtbUtils.removeBids(response, bid -> !"1".equals(bid.getId()))).isTrue();
assertThat(OpenRtbUtils.bids(response)).hasSize(2);
OpenRtbUtils.seatBid(response, "x").addBid(buildHtmlBid("unused", 100));
OpenRtbUtils.seatBid(response, "x").addBid(buildHtmlBid("4", 100));
assertThat(OpenRtbUtils.removeBids(response, "x", bid -> !"4".equals(bid.getId()))).isTrue();
assertThat(OpenRtbUtils.bids(response, "x")).hasSize(1);
assertThat(OpenRtbUtils.removeBids(response, "none", bid -> false))
.isFalse();
assertThat(OpenRtbUtils.removeBids(response, null, bid -> false))
.isTrue();
assertThat(OpenRtbUtils.removeBids(response, "x", bid -> false))
.isTrue();
assertThat(OpenRtbUtils.bids(response, "x")).isEmpty();
assertThat(OpenRtbUtils.removeBids(response, bid -> false)).isFalse();
assertThat(OpenRtbUtils.bids(response)).isEmpty();
}
示例9
@Test
public void testResponse_updater() {
BidResponse.Builder response = BidResponse.newBuilder().addSeatbid(SeatBid.newBuilder()
.addBid(buildHtmlBid("1", 100))
.addBid(buildHtmlBid("2", 200)));
OpenRtbUtils.seatBid(response, "unused");
Function<Bid.Builder, Boolean> inflation = bid -> {
if (bid.getPrice() < 150) {
bid.setPrice(bid.getPrice() * 2);
return true;
} else {
return false;
}
};
Function<Bid.Builder, Boolean> noUpdates = bid -> false;
assertThat(OpenRtbUtils.updateBids(response, inflation)).isTrue();
assertThat(OpenRtbUtils.updateBids(response, noUpdates)).isFalse();
assertThat(OpenRtbUtils.updateBids(response, noUpdates)).isFalse();
OpenRtbUtils.seatBid(response, "x").addBid(buildHtmlBid("1", 100));
OpenRtbUtils.seatBid(response, "x").addBid(buildHtmlBid("2", 200));
assertThat(OpenRtbUtils.updateBids(response, "x", inflation)).isTrue();
assertThat(OpenRtbUtils.updateBids(response, "x", noUpdates)).isFalse();
assertThat(OpenRtbUtils.updateBids(response, "none", noUpdates)).isFalse();
assertThat(OpenRtbUtils.updateBids(response, null, noUpdates)).isFalse();
}
示例10
private static BidResponse.Builder createBidResponse(String snippet) {
return BidResponse.newBuilder()
.setId("1")
.addSeatbid(SeatBid.newBuilder()
.setSeat("seat1")
.addBid(Bid.newBuilder()
.setId("1")
.setImpid("1")
.setPrice(1000)
.setAdm(snippet)));
}
示例11
@Test
public void testResponse() throws IOException {
testResponse(BidResponse.newBuilder()
.setId("0")
.addSeatbid(SeatBid.newBuilder()
.addBid(Bid.newBuilder()
.setId("bid1")
.setImpid("1")
.setPrice(1.0)
.setExtension(AdxExt.bid, BidExt.newBuilder()
.addAllImpressionTrackingUrl(asList("http://site.com/1", "http://site.com/2"))
.setAdChoicesDestinationUrl("http://adchoices.com")
.setBidderName("x")
.setExchangeDealType(ExchangeDealType.OPEN_AUCTION)
.setEventNotificationToken(EventNotificationToken.newBuilder()
.setPayload("token")
.build())
.addAllAttribute(asList(11, 22, 33))
.setAmpAdUrl("http://amp")
.setSdkRenderedAd(SdkRenderedAd.newBuilder()
.setId("sdk1")
.setRenderingData("data"))
.addAllRestrictedCategory(asList(44, 55, 66))
.setBillingId(77)
.setUseBidTranslationService(true)
.setThirdPartyBuyerToken("tpbt")
.setBuyerReportingId("bri1")
.build())))
.setExtension(AdxExt.bidResponse,
BidResponseExt.newBuilder().setProcessingTimeMs(99).build())
.build());
}
示例12
public final SeatBid.Builder readSeatBid(JsonParser par) throws IOException {
SeatBid.Builder seatbid = SeatBid.newBuilder();
for (startObject(par); endObject(par); par.nextToken()) {
String fieldName = getCurrentName(par);
if (par.nextToken() != JsonToken.VALUE_NULL) {
readSeatBidField(par, seatbid, fieldName);
}
}
return seatbid;
}
示例13
protected void writeSeatBidFields(SeatBid seatbid, JsonGenerator gen) throws IOException {
if (seatbid.getBidCount() != 0) {
gen.writeArrayFieldStart("bid");
for (Bid bid : seatbid.getBidList()) {
writeBid(bid, gen);
}
gen.writeEndArray();
}
if (seatbid.hasSeat()) {
gen.writeStringField("seat", seatbid.getSeat());
}
if (seatbid.hasGroup()) {
writeIntBoolField("group", seatbid.getGroup(), gen);
}
}
示例14
/**
* Processes the context's response in-place, modifying properties that may contain macros.
*/
public void process(SnippetProcessorContext bidCtx) {
for (SeatBid.Builder seat : bidCtx.response().getSeatbidBuilderList()) {
for (Bid.Builder bid : seat.getBidBuilderList()) {
bidCtx.setBid(bid);
processFields(bidCtx);
}
}
}
示例15
private void scanIters() {
while (!scanBidIter() && seatbidIter.hasNext()) {
SeatBid.Builder seatBid = seatbidIter.next();
if (OpenRtbUtils.filterSeat(seatBid, seatFilter)) {
bidIter = seatBid.getBidBuilderList().iterator();
}
}
}
示例16
/**
* @return The OpenRTB SeatBid with the specified ID; will be created if not existent.
* The ID should be present in the request's wseat.
*
* @see #seatBid(com.google.openrtb.OpenRtb.BidResponse.Builder)
* Use for the anonymous seat
*/
public static SeatBid.Builder seatBid(BidResponse.Builder response, String seat) {
checkNotNull(seat);
for (SeatBid.Builder seatbid : response.getSeatbidBuilderList()) {
if (seatbid.hasSeat() && seat.equals(seatbid.getSeat())) {
return seatbid;
}
}
return response.addSeatbidBuilder().setSeat(seat);
}
示例17
/**
* @return The anonymous OpenRTB SeatBid, used by non-seat-specific bids (the seat ID is not set).
* Will be created if not existent.
*/
public static SeatBid.Builder seatBid(BidResponse.Builder response) {
for (SeatBid.Builder seatbid : response.getSeatbidBuilderList()) {
if (!seatbid.hasSeat()) {
return seatbid;
}
}
return response.addSeatbidBuilder();
}
示例18
/**
* Iterates all bids from a specific seat.
*
* @param seatFilter Filter for seatFilter. You can use {@code null} to select the anonymous seat,
* or {@link #SEAT_ANY} to not filter by seat
* @return View for the seat's internal sequence of bids; or an empty, read-only
* view if that seat doesn't exist.
*/
public static List<Bid.Builder> bids(BidResponse.Builder response, @Nullable String seatFilter) {
for (SeatBid.Builder seatbid : response.getSeatbidBuilderList()) {
if (filterSeat(seatbid, seatFilter)) {
return seatbid.getBidBuilderList();
}
}
return ImmutableList.of();
}
示例19
/**
* Finds a bid by ID.
*
* @param id Bid ID, assumed to be unique within the response
* @return Matching bid's builder, or {@code null} if not found
*/
@Nullable public static Bid.Builder bidWithId(BidResponse.Builder response, String id) {
checkNotNull(id);
for (SeatBid.Builder seatbid : response.getSeatbidBuilderList()) {
for (Bid.Builder bid : seatbid.getBidBuilderList()) {
if (id.equals(bid.getId())) {
return bid;
}
}
}
return null;
}
示例20
/**
* Updates bids, from all seats.
*
* @param updater Update function. The {@code apply()} method can decide or not to update each
* object, and it's expected to return {@code true} for objects that were updated
* @return {@code true} if at least one bid was updated
* @see ProtoUtils#update(Iterable, Function) for more general updating support
*/
public static boolean updateBids(
BidResponse.Builder response, Function<Bid.Builder, Boolean> updater) {
checkNotNull(updater);
boolean updated = false;
for (SeatBid.Builder seatbid : response.getSeatbidBuilderList()) {
updated |= ProtoUtils.update(seatbid.getBidBuilderList(), updater);
}
return updated;
}
示例21
/**
* Updates bids from a given seat.
*
* @param seatFilter Seat ID, or {@code null} to select the anonymous seat
* @param updater Update function. The {@code apply()} method can decide or not to update each
* object, and it's expected to return {@code true} for objects that were updated
* @return {@code true} if at least one bid was updated
* @see ProtoUtils#update(Iterable, Function) for more general updating support
*/
public static boolean updateBids(
BidResponse.Builder response, @Nullable String seatFilter,
Function<Bid.Builder, Boolean> updater) {
checkNotNull(updater);
for (SeatBid.Builder seatbid : response.getSeatbidBuilderList()) {
if (filterSeat(seatbid, seatFilter)) {
return ProtoUtils.update(seatbid.getBidBuilderList(), updater);
}
}
return false;
}
示例22
/**
* Remove bids by bid.
*
* @param filter Returns {@code true} to keep bid, {@code false} to remove
* @return {@code true} if any bid was removed
* @see ProtoUtils#filter(List, Predicate) for more general filtering support
*/
public static boolean removeBids(BidResponse.Builder response, Predicate<Bid.Builder> filter) {
checkNotNull(filter);
boolean updated = false;
for (SeatBid.Builder seatbid : response.getSeatbidBuilderList()) {
updated |= removeBids(seatbid, filter);
}
return updated;
}
示例23
private static boolean removeBids(SeatBid.Builder seatbid, Predicate<Bid.Builder> filter) {
List<Bid.Builder> oldBids = seatbid.getBidBuilderList();
Iterable<Bid.Builder> newBids = ProtoUtils.filter(oldBids, filter);
if (newBids == oldBids) {
return false;
} else {
seatbid.clearBid();
for (Bid.Builder bid : newBids) {
seatbid.addBid(bid);
}
return true;
}
}
示例24
/**
* Remove bids by seat and bid.
*
* @param seatFilter Seat ID, or {@code null} to select the anonymous seat
* @param bidFilter Returns {@code true} to keep bid, {@code false} to remove
* @return {@code true} if any bid was removed
* @see ProtoUtils#filter(List, Predicate) for more general filtering support
*/
public static boolean removeBids(
BidResponse.Builder response, @Nullable String seatFilter, Predicate<Bid.Builder> bidFilter) {
checkNotNull(bidFilter);
boolean updated = false;
for (SeatBid.Builder seatbid : response.getSeatbidBuilderList()) {
if (filterSeat(seatbid, seatFilter)) {
updated |= removeBids(seatbid, bidFilter);
}
}
return updated;
}
示例25
@Test
public void testResponse_5_2_1() {
BidResponse.newBuilder()
.setId("1234567890")
.addSeatbid(SeatBid.newBuilder()
.addBid(Bid.newBuilder()
.setId("1")
.setImpid("102")
.setPrice(9.43)
.setAdid("314")
.setNurl("http://adserver.com/winnotice?impid=102")
.setAdm(
"%3C!DOCTYPE%20html%20PUBLIC%20%5C%22-"
+ "%2F%2FW3C%2F%2FDTD%20XHTML%201.0%20Transitional%2F%2FEN%5C%22%20%5C%22htt"
+ "p%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2FDTD%2Fxhtml1-"
+ "transitional.dtd%5C%22%3E%3Chtml%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F1"
+ "999%2Fxhtml%5C%22%20xml%3Alang%3D%5C%22en%5C%22%20lang%3D%5C%22en%5C%22"
+ "%3E...%3C%2Fhtml%3E")
.addAdomain("advertiserdomain.com")
.setIurl("http://adserver.com/pathtosampleimage")
.setCid("campaign111")
.setCrid("creative112")
.addAllAttr(asList(CreativeAttribute.ANNOYING, CreativeAttribute.AUDIO_AUTO_PLAY)))
.setSeat("512"))
.setBidid("abc1123")
.setCur("USD")
.build();
}
示例26
@Test
public void testResponse_emptyMessages() throws IOException {
OpenRtbJsonFactory jsonFactory = newJsonFactory();
testResponse(jsonFactory, BidResponse.newBuilder().setId("1").build());
testResponse(jsonFactory,
BidResponse.newBuilder().setId("1").addSeatbid(SeatBid.newBuilder()).build());
testResponse(jsonFactory, BidResponse.newBuilder().setId("1").addSeatbid(SeatBid.newBuilder()
.addBid(Bid.newBuilder().setId("0").setImpid("0").setPrice(0))).build());
}
示例27
@Test(expected = UndefinedMacroException.class)
public void testUndefinedSeat() {
OpenRtbSnippetProcessor processor = new OpenRtbSnippetProcessor(true);
SnippetProcessorContext ctx = new SnippetProcessorContext(
BidRequest.newBuilder().setId("req1").build(),
BidResponse.newBuilder().addSeatbid(SeatBid.newBuilder().setSeat("seat1")));
ctx.setBid(Bid.newBuilder().setId("bid1").setImpid("imp1").setPrice(10000));
processor.process(ctx,
OpenRtbMacros.AUCTION_SEAT_ID.key());
}
示例28
@Test(expected = UnsupportedOperationException.class)
public void testResponse_unsupportedRemove() {
BidResponse.Builder response = BidResponse.newBuilder().addSeatbid(SeatBid.newBuilder()
.addBid(buildHtmlBid("1", 100)));
Iterator<Bid.Builder> bids = OpenRtbUtils.bids(response).iterator();
bids.next();
bids.remove();
}
示例29
/**
* Create a protobuf based bid response, multiple creative response.
* @param br GoogleBidRequest. The Bid request corresponding to this response.
* @param imp Impression. The impression belonging to this response.
* @param multi List. The list of selected creatives that match.
* @param xtime int. The time it took to make the request.
* @throws Exception on Protobuf serialization errors.
*/
public GoogleBidResponse(GoogleBidRequest br, Impression imp, List<SelectedCreative> multi, int xtime) throws Exception {
this.br = br;
this.exchange = br.getExchange();
this.xtime = xtime;
this.oidStr = br.id;
this.impid = imp.getImpid();
setResponseType();
/** The configuration used for generating this response */
Configuration config = Configuration.getInstance();
StringBuilder snurl = new StringBuilder();
/**
* Create the stub for the nurl, thus
*/
StringBuilder xnurl = new StringBuilder(config.winUrl);
xnurl.append("/");
xnurl.append(br.getExchange());
xnurl.append("/");
xnurl.append("${AUCTION_PRICE}"); // to get the win price back from the
// Exchange....
xnurl.append("/");
xnurl.append(lat);
xnurl.append("/");
xnurl.append(lon);
xnurl.append("/");
SeatBid.Builder sbb = SeatBid.newBuilder();
for (int i=0;i<multi.size(); i++) {
SelectedCreative x = multi.get(i);
this.camp = x.getCampaign();
this.creat = x.getCreative();
this.price = Double.toString(x.price /* * 1000000 */);
this.dealId = x.dealId;
this.adid = camp.adId;
this.imageUrl = substitute(creat.imageurl);
String billingId = getBillingId(camp,creat);
snurl = new StringBuilder(xnurl);
snurl.append(adid);
snurl.append("/");
snurl.append(creat.impid);
snurl.append("/");
snurl.append(oidStr.replaceAll("#", "%23"));
snurl.append("/");
snurl.append(br.siteId);
Bid.Builder bb = Bid.newBuilder();
bb.addAdomain(camp.adomain);
bb.setW(this.width);
bb.setH(this.height);
bb.setCid(billingId);
bb.setAdid(camp.adId);
//bb.setNurl(snurl.toString());
bb.setExtension(AdxExt.bid, BidExt.newBuilder()
.addAllImpressionTrackingUrl(asList(snurl.toString())).build());
bb.setImpid(x.impid);
bb.setId(br.id);
bb.setPrice(x.price * 100000);
if (dealId != null)
bb.setDealid(x.dealId);
bb.setIurl(substitute(imageUrl));
String adm;
if (br.usesEncodedAdm)
adm = substitute(creat.encodedAdm);
else
adm = substitute(creat.unencodedAdm);
bb.setAdm(adm);
sbb.addBid(bb.build());
}
sbb.setSeat(Configuration.getInstance().seats.get(exchange));
SeatBid seatBid = sbb.build();
builder.addSeatbid(seatBid);
builder.setCur(creat.cur);
internal = builder.build();
}
示例30
public final void writeSeatBid(SeatBid seatbid, JsonGenerator gen) throws IOException {
gen.writeStartObject();
writeSeatBidFields(seatbid, gen);
writeExtensions(seatbid, gen);
gen.writeEndObject();
}