4646import java .security .NoSuchAlgorithmException ;
4747import java .security .NoSuchProviderException ;
4848import java .security .UnrecoverableKeyException ;
49+ import java .util .HashMap ;
4950import java .util .concurrent .ConcurrentHashMap ;
5051import java .util .concurrent .ConcurrentLinkedQueue ;
5152import java .util .Map ;
@@ -170,6 +171,11 @@ public class AWSIotMqttManager {
170171 */
171172 String userMetaData = "?SDK=Android&Version=" + VersionInfoUtils .getVersion ();
172173
174+ /**
175+ * Map to store user metadata components.
176+ */
177+ Map <String , String > userMetaDataMap = new HashMap <String , String >();
178+
173179 /**
174180 * This is your custom endpoint that allows you to connect to AWS IoT.
175181 */
@@ -214,10 +220,14 @@ public boolean isMetricsEnabled() {
214220 private Long unitTestMillisOverride ;
215221
216222 /**
223+ * @deprecated Since 2.13.2 this method will be removed in the next minor version.
224+ * Please use updateUserMetaData method instead.
225+ *
217226 * Sets the userMetaData map.
218227 *
219228 * @param userMetaDataMap userMetaData map
220229 */
230+ @ Deprecated
221231 public void addUserMetaData (Map <String , String > userMetaDataMap ) {
222232 StringBuilder userMetadata = new StringBuilder (this .userMetaData );
223233 int baseLength = userMetadata .length ();
@@ -243,6 +253,45 @@ public void addUserMetaData(Map<String, String> userMetaDataMap) {
243253 }
244254 }
245255
256+ /**
257+ * This is an internal method.
258+ *
259+ * @param userMetaDataMap userMetaData map
260+ */
261+ public void updateUserMetaData (Map <String , String > userMetaDataMap ) {
262+ StringBuilder userMetadata = new StringBuilder ("?SDK=Android&Version=" + VersionInfoUtils .getVersion ());
263+ int baseLength = userMetadata .length ();
264+
265+ // Update the meta data map
266+ if (userMetaDataMap != null ) {
267+ for (Map .Entry <String , String > metaData : userMetaDataMap .entrySet ()) {
268+ this .userMetaDataMap .put (metaData .getKey (), metaData .getValue ());
269+ }
270+ }
271+
272+ // Append each of the user-specified key-value pair to the user metadata for the connection
273+ for (Map .Entry <String , String > metaData : this .userMetaDataMap .entrySet ()) {
274+ if (!(metaData .getKey ().equals ("SDK" ) || metaData .getKey ().equals ("Version" ))) {
275+ String metaDataValue = metaData .getValue ();
276+ if (metaDataValue == null || "" .equals (metaDataValue )){
277+ userMetadata .append ("&" + metaData .getKey ());
278+ } else {
279+ userMetadata .append ("&" + metaData .getKey () + "=" + metaData .getValue ());
280+ }
281+ } else {
282+ LOGGER .warn ("Keynames 'SDK' and 'Version' are reserved and will be skipped" );
283+ }
284+ }
285+
286+ if (userMetadata .length () > 255 ) {
287+ LOGGER .warn ("Too many characters. User metadata was truncated." , new IllegalArgumentException ("Total number of characters in user metadata" +
288+ " cannot exceed " + (255 - baseLength )));
289+ this .userMetaData = userMetadata .substring (0 , 255 );
290+ } else {
291+ this .userMetaData = userMetadata .toString ();
292+ }
293+ }
294+
246295 /**
247296 * Return the customer specific endpoint prefix.
248297 *
0 commit comments