2121import org .prebid .server .exception .PreBidException ;
2222import org .prebid .server .json .DecodeException ;
2323import org .prebid .server .json .JacksonMapper ;
24+ import org .prebid .server .proto .openrtb .ext .ExtPrebid ;
2425import org .prebid .server .proto .openrtb .ext .request .ExtPublisher ;
2526import org .prebid .server .proto .openrtb .ext .request .sparteo .ExtImpSparteo ;
26- import org .prebid .server .proto .openrtb .ext .request .sparteo .ExtImpParamsSparteo ;
2727import org .prebid .server .proto .openrtb .ext .response .BidType ;
2828import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebid ;
2929import org .prebid .server .util .BidderUtil ;
3232import java .util .ArrayList ;
3333import java .util .Collection ;
3434import java .util .Collections ;
35- import java .util .HashMap ;
35+ import java .util .Iterator ;
3636import java .util .List ;
3737import java .util .Map ;
3838import java .util .Objects ;
3939import java .util .Optional ;
4040
4141public class SparteoBidder implements Bidder <BidRequest > {
4242
43+ private static final TypeReference <ExtPrebid <?, ExtImpSparteo >> TYPE_REFERENCE =
44+ new TypeReference <>() { };
45+
4346 private final String endpointUrl ;
4447 private final JacksonMapper mapper ;
4548
@@ -56,19 +59,16 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
5659
5760 for (Imp imp : request .getImp ()) {
5861 try {
59- final ObjectNode impExt = mapper .mapper ().convertValue (imp .getExt (), ObjectNode .class );
60-
61- final JsonNode bidderNode = impExt .get ("bidder" );
62- final ExtImpSparteo bidderParams = mapper .mapper ().treeToValue (bidderNode , ExtImpSparteo .class );
62+ final ExtImpSparteo bidderParams = parseExtImp (imp );
6363
6464 if (siteNetworkId == null && bidderParams .getNetworkId () != null ) {
6565 siteNetworkId = bidderParams .getNetworkId ();
6666 }
6767
68- final ObjectNode modifiedExt = buildImpExt ( impExt , bidderParams , mapper );
68+ final ObjectNode modifiedExt = modifyImpExt ( imp );
6969
7070 modifiedImps .add (imp .toBuilder ().ext (modifiedExt ).build ());
71- } catch (JsonProcessingException e ) {
71+ } catch (PreBidException e ) {
7272 errors .add (BidderError .badInput (
7373 "ignoring imp id=%s, error processing ext: %s" .formatted (
7474 imp .getId (), e .getMessage ())));
@@ -89,48 +89,35 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
8989 return Result .of (Collections .singletonList (call ), errors );
9090 }
9191
92- private ObjectNode buildImpExt (ObjectNode impExt , ExtImpSparteo bidderParams , JacksonMapper mapper )
93- throws JsonProcessingException {
94-
95- final String adUnitCode = Optional .ofNullable (impExt .get ("prebid" ))
96- .map (prebidNode -> prebidNode .get ("adunitcode" ))
97- .filter (JsonNode ::isTextual )
98- .map (JsonNode ::asText )
99- .orElse (null );
92+ private ExtImpSparteo parseExtImp (Imp imp ) {
93+ try {
94+ return mapper .mapper ().convertValue (imp .getExt (), TYPE_REFERENCE ).getBidder ();
95+ } catch (IllegalArgumentException e ) {
96+ throw new PreBidException ("invalid imp.ext" );
97+ }
98+ }
10099
101- final Map <String , JsonNode > sparteoProperties = Optional .ofNullable (impExt .get ("sparteo" ))
102- .map (sparteoNode -> sparteoNode .get ("params" ))
103- .filter (JsonNode ::isObject )
104- .map (paramsNode -> mapper .mapper ().convertValue (paramsNode ,
105- new TypeReference <Map <String , JsonNode >>() { }))
106- .orElse (Collections .emptyMap ());
107-
108- final Map <String , JsonNode > additionnalProperties = new HashMap <>(sparteoProperties );
109- additionnalProperties .putAll (bidderParams .getAdditionalProperties ());
110-
111- final ExtImpParamsSparteo sparteoParams = ExtImpParamsSparteo .of (
112- bidderParams .getNetworkId (),
113- bidderParams .getCustom1 (),
114- bidderParams .getCustom2 (),
115- bidderParams .getCustom3 (),
116- bidderParams .getCustom4 (),
117- bidderParams .getCustom5 (),
118- adUnitCode ,
119- additionnalProperties );
120-
121- final ObjectNode ext = mapper .mapper ().createObjectNode ();
122-
123- impExt .fields ().forEachRemaining (entry -> {
124- final String key = entry .getKey ();
125- if (!key .equals ("bidder" ) && !key .equals ("sparteo" )) {
126- ext .set (key , entry .getValue ());
100+ private static ObjectNode modifyImpExt (Imp imp ) {
101+ final ObjectNode modifiedImpExt = imp .getExt ().deepCopy ();
102+ final JsonNode sparteoJsonNode = modifiedImpExt .get ("sparteo" );
103+ final ObjectNode sparteoNode = sparteoJsonNode == null || !sparteoJsonNode .isObject ()
104+ ? modifiedImpExt .putObject ("sparteo" )
105+ : (ObjectNode ) sparteoJsonNode ;
106+
107+ final JsonNode paramsJsonNode = sparteoNode .get ("params" );
108+ final ObjectNode paramsNode = paramsJsonNode == null || !paramsJsonNode .isObject ()
109+ ? sparteoNode .putObject ("params" )
110+ : (ObjectNode ) paramsJsonNode ;
111+
112+ final JsonNode bidderJsonNode = modifiedImpExt .remove ("bidder" );
113+ if (bidderJsonNode != null && bidderJsonNode .isObject ()) {
114+ final Iterator <Map .Entry <String , JsonNode >> fields = bidderJsonNode .fields ();
115+ while (fields .hasNext ()) {
116+ final Map .Entry <String , JsonNode > field = fields .next ();
117+ paramsNode .set (field .getKey (), field .getValue ());
127118 }
128- });
129-
130- final ObjectNode sparteoParamsAsNode = mapper .mapper ().convertValue (sparteoParams , ObjectNode .class );
131- ext .putObject ("sparteo" ).set ("params" , sparteoParamsAsNode );
132-
133- return ext ;
119+ }
120+ return modifiedImpExt ;
134121 }
135122
136123 private Site modifySite (Site site , String siteNetworkId , JacksonMapper mapper ) {
0 commit comments