2727import com .google .ads .googleads .v19 .services .ClickConversion ;
2828import com .google .ads .googleads .v19 .services .ClickConversionResult ;
2929import com .google .ads .googleads .v19 .services .ConversionUploadServiceClient ;
30+ import com .google .ads .googleads .v19 .services .SessionAttributeKeyValuePair ;
31+ import com .google .ads .googleads .v19 .services .SessionAttributesKeyValuePairs ;
3032import com .google .ads .googleads .v19 .services .UploadClickConversionsRequest ;
3133import com .google .ads .googleads .v19 .services .UploadClickConversionsResponse ;
3234import com .google .ads .googleads .v19 .utils .ResourceNames ;
3335import com .google .common .collect .ImmutableMap ;
36+ import com .google .protobuf .ByteString ;
3437import java .io .FileNotFoundException ;
3538import java .io .IOException ;
3639import java .io .UnsupportedEncodingException ;
3740import java .security .MessageDigest ;
3841import java .security .NoSuchAlgorithmException ;
3942import java .util .ArrayList ;
43+ import java .util .Arrays ;
4044import java .util .List ;
4145import java .util .Map ;
46+ import java .util .stream .Collectors ;
4247
4348/**
4449 * Uploads an enhanced conversion for leads by uploading a ClickConversion with hashed, first-party
4752 * the lead.
4853 */
4954public class UploadEnhancedConversionsForLeads {
55+
5056 private static class UploadEnhancedConversionsForLeadsParams extends CodeSampleParams {
5157
5258 @ Parameter (names = ArgumentNames .CUSTOMER_ID , required = true )
@@ -75,6 +81,24 @@ private static class UploadEnhancedConversionsForLeadsParams extends CodeSampleP
7581
7682 @ Parameter (names = ArgumentNames .AD_USER_DATA_CONSENT , required = false )
7783 private ConsentStatus adUserDataConsent ;
84+
85+ @ Parameter (
86+ names = ArgumentNames .SESSION_ATTRIBUTES_ENCODED ,
87+ required = false ,
88+ description =
89+ "A session attributes token. Only one of sessionAttributesEncoded or sessionAttributesMap"
90+ + " should be passed." )
91+ private String sessionAttributesEncoded ;
92+
93+ @ Parameter (
94+ names = ArgumentNames .SESSION_ATTRIBUTES_MAP ,
95+ required = false ,
96+ description =
97+ "A "
98+ + "space-delimited list of session attribute key value pairs. Each pair should be "
99+ + "separated by an equal sign, for example: 'gad_campaignid=12345 gad_source=1'. Only "
100+ + "one of sessionAttributesEncoded or sessionAttributesMap should be passed." )
101+ private String sessionAttributesMap ;
78102 }
79103
80104 public static void main (String [] args )
@@ -94,8 +118,14 @@ public static void main(String[] args)
94118 params .gclid = null ;
95119 // Optional: specify the ad user data consent for the click.
96120 params .adUserDataConsent = null ;
121+ params .sessionAttributesEncoded = null ;
122+ params .sessionAttributesMap = null ;
97123 }
98124
125+ if ((params .sessionAttributesEncoded != null ) && (params .sessionAttributesMap != null )) {
126+ throw new IllegalArgumentException (
127+ "Only one of sessionAttributesEncoded or " + "sessionAttributesMap can be set." );
128+ }
99129 GoogleAdsClient googleAdsClient = null ;
100130 try {
101131 googleAdsClient = GoogleAdsClient .newBuilder ().fromPropertiesFile ().build ();
@@ -118,7 +148,9 @@ public static void main(String[] args)
118148 params .conversionValue ,
119149 params .orderId ,
120150 params .gclid ,
121- params .adUserDataConsent );
151+ params .adUserDataConsent ,
152+ params .sessionAttributesEncoded ,
153+ params .sessionAttributesMap );
122154 } catch (GoogleAdsException gae ) {
123155 // GoogleAdsException is the base class for most exceptions thrown by an API request.
124156 // Instances of this exception have a message and a GoogleAdsFailure that contains a
@@ -155,7 +187,9 @@ private void runExample(
155187 Double conversionValue ,
156188 String orderId ,
157189 String gclid ,
158- ConsentStatus adUserDataConsent )
190+ ConsentStatus adUserDataConsent ,
191+ String sessionAttributesEncoded ,
192+ String sessionAttributesMap )
159193 throws UnsupportedEncodingException , NoSuchAlgorithmException {
160194 // [START add_user_identifiers]
161195 // Creates an empty builder for constructing the click conversion.
@@ -204,6 +238,12 @@ private void runExample(
204238 if (adUserDataConsent != null ) {
205239 rawRecordBuilder .put ("adUserDataConsent" , adUserDataConsent .name ());
206240 }
241+ if (sessionAttributesEncoded != null ) {
242+ rawRecordBuilder .put ("sessionAttributesEncoded" , sessionAttributesEncoded );
243+ }
244+ if (sessionAttributesMap != null ) {
245+ rawRecordBuilder .put ("sessionAttributesMap" , sessionAttributesMap );
246+ }
207247
208248 // Builds the map representing the record.
209249 Map <String , String > rawRecord = rawRecordBuilder .build ();
@@ -266,6 +306,35 @@ private void runExample(
266306 .setAdUserData (ConsentStatus .valueOf (rawRecord .get ("adUserDataConsent" ))));
267307 }
268308
309+ // Sets one of the sessionAttributesEncoded or sessionAttributesKeyValuePairs if either is
310+ // provided.
311+ if (rawRecord .containsKey ("sessionAttributesEncoded" )) {
312+ clickConversionBuilder .setSessionAttributesEncoded (
313+ ByteString .copyFromUtf8 (rawRecord .get ("sessionAttributesEncoded" )));
314+ } else if (rawRecord .containsKey ("sessionAttributesMap" )) {
315+ List <String > pairings =
316+ Arrays .stream (rawRecord .get ("sessionAttributesMap" ).split (" " ))
317+ .map (String ::trim )
318+ .collect (Collectors .toList ());
319+ SessionAttributesKeyValuePairs .Builder sessionAttributePairs =
320+ SessionAttributesKeyValuePairs .newBuilder ();
321+ for (String pair : pairings ) {
322+ String [] parts = pair .split ("=" , 2 );
323+ if (parts .length != 2 ) {
324+ throw new IllegalArgumentException (
325+ "Failed to read the sessionAttributesMap. SessionAttributesMap must use a "
326+ + "space-delimited list of session attribute key value pairs. Each pair should be"
327+ + " separated by an equal sign, for example: 'gad_campaignid=12345 gad_source=1'" );
328+ }
329+ sessionAttributePairs .addKeyValuePairs (
330+ SessionAttributeKeyValuePair .newBuilder ()
331+ .setSessionAttributeKey (parts [0 ])
332+ .setSessionAttributeValue (parts [1 ])
333+ .build ());
334+ }
335+ clickConversionBuilder .setSessionAttributesKeyValuePairs (sessionAttributePairs .build ());
336+ }
337+
269338 // Calls build to build the conversion.
270339 ClickConversion clickConversion = clickConversionBuilder .build ();
271340 // [END add_conversion_details]
0 commit comments