/* * Copyright (c) 2013-2016. Urban Airship and Contributors */ package com.urbanairship.api.nameduser; import com.google.common.base.Preconditions; import com.google.common.net.HttpHeaders; import com.urbanairship.api.client.Request; import com.urbanairship.api.client.RequestUtils; import com.urbanairship.api.client.ResponseParser; import com.urbanairship.api.nameduser.parse.NamedUserObjectMapper; import org.apache.http.entity.ContentType; import java.io.IOException; import java.net.URI; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * The NamedUserTagRequest class builds named user tag mutation requests to be executed in * the {@link com.urbanairship.api.client.UrbanAirshipClient}. */ public class NamedUserTagRequest implements Request<String> { private final static String API_NAMED_USERS_TAGS = "/api/named_users/tags/"; private static final String NAMED_USER_AUDIENCE_KEY = "named_user_id"; private static final String AUDIENCE_KEY = "audience"; private static final String ADD_KEY = "add"; private static final String REMOVE_KEY = "remove"; private static final String SET_KEY = "set"; private final Map<String, Set<String>> audience = new HashMap<String, Set<String>>(); private final Map<String, Set<String>> addTags = new HashMap<String, Set<String>>(); private final Map<String, Set<String>> removeTags = new HashMap<String, Set<String>>(); private final Map<String, Set<String>> setTags = new HashMap<String, Set<String>>(); /** * Create new named user tag mutations request. * * @return NamedUserTagRequest */ public static NamedUserTagRequest newRequest() { return new NamedUserTagRequest(); } private NamedUserTagRequest() {} /** * Add a named user to the request audience. * * @param namedUser String * @return NamedUserTagRequest */ public NamedUserTagRequest addNamedUser(String namedUser) { return addNamedUsers(namedUser); } /** * Add multiple named users to the request audience. * * @param namedUsers String... of named users * @return NamedUserTagRequest */ public NamedUserTagRequest addNamedUsers(String... namedUsers) { return addNamedUsers(new HashSet<String>(Arrays.asList(namedUsers))); } /** * Add multiple named users to the request audience. * * @param namedUsers Set of named users * @return NamedUserTagRequest */ public NamedUserTagRequest addNamedUsers(Set<String> namedUsers) { appendMapValues(NAMED_USER_AUDIENCE_KEY, namedUsers, this.audience); return this; } /** * Add tag group and tags to be added to named user. * * @param tagGroup String * @param tags Set of tags * @return NamedUserTagRequest */ public NamedUserTagRequest addTags(String tagGroup, Set<String> tags) { appendMapValues(tagGroup, tags, this.addTags); return this; } /** * Add tag group and tags to be removed from named user. * * @param tagGroup String * @param tags Set of tags * @return NamedUserTagRequest */ public NamedUserTagRequest removeTags(String tagGroup, Set<String> tags) { appendMapValues(tagGroup, tags, this.removeTags); return this; } /** * Add tag group and tags to be set to named user. * * @param tagGroup String * @param tags Set of tags * @return NamedUserTagRequest */ public NamedUserTagRequest setTags(String tagGroup, Set<String> tags) { appendMapValues(tagGroup, tags, this.setTags); return this; } @Override public ContentType getContentType() { return ContentType.APPLICATION_JSON; } @Override public Map<String, String> getRequestHeaders() { Map<String, String> headers = new HashMap<String, String>(); headers.put(HttpHeaders.CONTENT_TYPE, CONTENT_TYPE_JSON); headers.put(HttpHeaders.ACCEPT, UA_VERSION_JSON); return headers; } @Override public HttpMethod getHttpMethod() { return HttpMethod.POST; } @Override public String getRequestBody() { final Map<String, Map<String, Set<String>>> payload = new HashMap<String, Map<String, Set<String>>>(); payload.put(AUDIENCE_KEY, audience); if (!addTags.isEmpty()) { payload.put(ADD_KEY, addTags); } if (!removeTags.isEmpty()) { payload.put(REMOVE_KEY, removeTags); } if (!setTags.isEmpty()) { payload.put(SET_KEY, setTags); } Preconditions.checkArgument(payload.containsKey(AUDIENCE_KEY), "Audience required when executing a named user tag operation"); Preconditions.checkArgument(payload.containsKey(ADD_KEY) || payload.containsKey(REMOVE_KEY) || payload.containsKey(SET_KEY), "Add, remove, or set operation required when executing a named user tag operation"); if (payload.containsKey(SET_KEY)) { Preconditions.checkArgument(!payload.containsKey(REMOVE_KEY) && !payload.containsKey(ADD_KEY)); } try { return NamedUserObjectMapper.getInstance().writeValueAsString(payload); } catch (Exception e) { return "{ \"exception\" : \"" + e.getClass().getName() + "\", \"message\" : \"" + e.getMessage() + "\" }"; } } @Override public URI getUri(URI baseUri) { return RequestUtils.resolveURI(baseUri, API_NAMED_USERS_TAGS); } @Override public ResponseParser<String> getResponseParser() { return new ResponseParser<String>() { @Override public String parse(String response) throws IOException { return response; } }; } private static void appendMapValues(String key, Set<String> values, Map<String, Set<String>> map) { if (!map.containsKey(key)) { map.put(key, values); } else { Set<String> newSet = map.get(key); newSet.addAll(values); map.put(key, newSet); } } }