http://git-wip-us.apache.org/repos/asf/usergrid/blob/7e0ffbc0/sdks/android/src/main/java/org/apache/usergrid/android/sdk/UGClient.java ---------------------------------------------------------------------- diff --git a/sdks/android/src/main/java/org/apache/usergrid/android/sdk/UGClient.java b/sdks/android/src/main/java/org/apache/usergrid/android/sdk/UGClient.java deleted file mode 100755 index 06325af..0000000 --- a/sdks/android/src/main/java/org/apache/usergrid/android/sdk/UGClient.java +++ /dev/null @@ -1,3181 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.usergrid.android.sdk; - -import static org.apache.usergrid.android.sdk.utils.ObjectUtils.isEmpty; -import static org.apache.usergrid.android.sdk.utils.UrlUtils.addQueryParams; -import static org.apache.usergrid.android.sdk.utils.UrlUtils.encodeParams; -import static org.apache.usergrid.android.sdk.utils.UrlUtils.path; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.Date; - -import android.location.Location; -import android.location.LocationManager; -import android.location.LocationListener; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; - -import org.apache.usergrid.android.sdk.URLConnectionFactory; -import org.apache.usergrid.android.sdk.callbacks.ApiResponseCallback; -import org.apache.usergrid.android.sdk.callbacks.ClientAsyncTask; -import org.apache.usergrid.android.sdk.callbacks.GroupsRetrievedCallback; -import org.apache.usergrid.android.sdk.callbacks.QueryResultsCallback; -import org.apache.usergrid.android.sdk.entities.Activity; -import org.apache.usergrid.android.sdk.entities.Collection; -import org.apache.usergrid.android.sdk.entities.Device; -import org.apache.usergrid.android.sdk.entities.Entity; -import org.apache.usergrid.android.sdk.entities.Group; -import org.apache.usergrid.android.sdk.entities.Message; -import org.apache.usergrid.android.sdk.entities.User; -import org.apache.usergrid.android.sdk.response.ApiResponse; -import org.apache.usergrid.android.sdk.utils.DeviceUuidFactory; -import org.apache.usergrid.android.sdk.utils.JsonUtils; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.DeserializationFeature; - - -/** - * The UGClient class for accessing the Usergrid API. Start by instantiating this - * class though the appropriate constructor. Most calls to the API will be handled - * by the methods in this class. - * - * @see org.apache.usergrid.android.sdk.UGClient - * @see <a href="http://apigee.com/docs/app-services/content/installing-apigee-sdk-android">Usergrid SDK install guide</a> - */ -public class UGClient { - - /** - * Most current version of the Usergrid Android SDK - */ - public static final String SDK_VERSION = "0.0.8"; - /** - * Platform type of this SDK - */ - public static final String SDK_TYPE = "Android"; - - /** - * @y.exclude - */ - public static final String OPTION_KEY_BASE_URL = "baseURL"; - - /** - * @y.exclude - */ - public static boolean FORCE_PUBLIC_API = false; - - /** - * Public API - */ - public static String PUBLIC_API_URL = "https://api.usergrid.com"; - - /** - * Local API of standalone server - */ - public static String LOCAL_STANDALONE_API_URL = "http://localhost:8080"; - - /** - * Local API of Tomcat server in Eclipse - */ - public static String LOCAL_TOMCAT_API_URL = "http://localhost:8080/ROOT"; - - /** - * Local API - */ - public static String LOCAL_API_URL = LOCAL_STANDALONE_API_URL; - - /** - * Standard HTTP methods use in generic request methods - * @see apiRequest - * @see doHttpRequest - */ - protected static final String HTTP_METHOD_DELETE = "DELETE"; - /** - * Standard HTTP methods use in generic request methods - * @see apiRequest - * @see doHttpRequest - */ - protected static final String HTTP_METHOD_GET = "GET"; - /** - * Standard HTTP methods use in generic request methods - * @see apiRequest - * @see doHttpRequest - */ - protected static final String HTTP_METHOD_POST = "POST"; - /** - * Standard HTTP methods use in generic request methods - * @see apiRequest - * @see doHttpRequest - */ - protected static final String HTTP_METHOD_PUT = "PUT"; - - protected static final String LOGGING_TAG = "UGCLIENT"; - - private String apiUrl = PUBLIC_API_URL; - - private String organizationId; - private String applicationId; - private String clientId; - private String clientSecret; - - private User loggedInUser = null; - - private String accessToken = null; - - private String currentOrganization = null; - private URLConnectionFactory urlConnectionFactory = new DefaultURLConnectionFactory(); - - private LocationManager locationManager; - private UUID deviceID; - - /** - * Interface for EntityQuery and QueueQuery - */ - public interface Query { - - public ApiResponse getResponse(); - - public boolean more(); - - public Query next(); - - } - - /** - * @y.exclude - */ - public static boolean isUuidValid(UUID uuid) { - return( uuid != null ); - } - - protected static String arrayToDelimitedString(String[] arrayOfStrings, String delimiter) { - StringBuilder sb = new StringBuilder(); - - for( int i = 0; i < arrayOfStrings.length; ++i ) { - if( i > 0 ) { - sb.append(delimiter); - } - - sb.append(arrayOfStrings[i]); - } - - return sb.toString(); - } - - protected static String[] tokenizeToStringArray(String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) { - if (str == null) { - return null; - } - - StringTokenizer st = new StringTokenizer(str, delimiters); - - int numTokens = st.countTokens(); - List<String> listTokens; - - if( numTokens > 0 ) { - - listTokens = new ArrayList<String>(numTokens); - - while (st.hasMoreTokens()) { - - String token = st.nextToken(); - - if (trimTokens) { - token = token.trim(); - } - - if (!ignoreEmptyTokens || token.length() > 0) { - listTokens.add(token); - } - } - } else { - listTokens = new ArrayList<String>(); - } - - return listTokens.toArray(new String[listTokens.size()]); - } - - - /****************** CONSTRUCTORS ***********************/ - /****************** CONSTRUCTORS ***********************/ - - /** - * @y.exclude - */ - public UGClient() { - init(); - } - - /** - * Instantiate a data client for a specific app. This is used to call most - * SDK methods. - * - * @param organizationId the Usergrid organization name - * @param applicationId the Usergrid application id or name - */ - public UGClient(String organizationId, String applicationId) { - init(); - this.organizationId = organizationId; - this.applicationId = applicationId; - } - - /** - * Instantiate a data client for a specific app with a base URL other than the default - * api.usergrid.com. This is used to call most SDK methods. - * - * @param organizationId the Usergrid organization name - * @param applicationId the Usergrid application id or name - * @param baseURL the base URL to use for all API calls - */ - public UGClient(String organizationId, String applicationId, String baseURL) { - init(); - this.organizationId = organizationId; - this.applicationId = applicationId; - - if( baseURL != null ) { - this.setApiUrl(baseURL); - } - } - - public void init() { - } - - - /****************** ACCESSORS/MUTATORS ***********************/ - /****************** ACCESSORS/MUTATORS ***********************/ - - /** - * Sets a new URLConnectionFactory object in the UGClient - * - * @param urlConnectionFactory a new URLConnectionFactory object - * @y.exclude - */ - public void setUrlConnectionFactory(URLConnectionFactory urlConnectionFactory) { - if (urlConnectionFactory == null) { - this.urlConnectionFactory = new DefaultURLConnectionFactory(); - } else { - this.urlConnectionFactory = urlConnectionFactory; - } - } - - /** - * @return the Usergrid API url (default: http://api.usergrid.com) - */ - public String getApiUrl() { - return apiUrl; - } - - /** - * Sets the base URL for API requests - * - * @param apiUrl the API base url to be set (default: http://api.usergrid.com) - */ - public void setApiUrl(String apiUrl) { - this.apiUrl = apiUrl; - } - - /** - * Sets the base URL for API requests and returns the updated UGClient object - * - * @param apiUrl the Usergrid API url (default: http://api.usergrid.com) - * @return UGClient object for method call chaining - */ - public UGClient withApiUrl(String apiUrl) { - this.apiUrl = apiUrl; - return this; - } - - - /** - * Sets the Usergrid organization ID and returns the UGClient object - * - * @param organizationId the organizationId to set - * @return the updated UGClient object - */ - public UGClient withOrganizationId(String organizationId){ - this.organizationId = organizationId; - return this; - } - - - - /** - * Gets the current Usergrid organization ID set in the UGClient - * - * @return the current organizationId - */ - public String getOrganizationId() { - return organizationId; - } - - /** - * Sets the Usergrid organization ID - * - * @param organizationId the organizationId to set - */ - public void setOrganizationId(String organizationId) { - this.organizationId = organizationId; - } - - /** - * Gets the current Usergrid application ID set in the UGClient - * - * @return the current organizationId or name - */ - public String getApplicationId() { - return applicationId; - } - - /** - * Sets the Usergrid application Id - * - * @param applicationId the application id or name - */ - public void setApplicationId(String applicationId) { - this.applicationId = applicationId; - } - - - /** - * Sets the Usergrid application ID and returns the UGClient object - * - * @param applicationId the application ID to set - * @return the updated UGClient object - */ - public UGClient withApplicationId(String applicationId) { - this.applicationId = applicationId; - return this; - } - - /** - * Gets the application (not organization) client ID credential for making calls as the - * application-owner. Not safe for most mobile use. - * @return the client id - */ - public String getClientId() { - return clientId; - } - - /** - * Sets the application (not organization) client ID credential, used for making - * calls as the application-owner. Not safe for most mobile use. - * @param clientId the client id - */ - public void setClientId(String clientId) { - this.clientId = clientId; - } - - /** - * Sets the client ID credential in the UGClient object. Not safe for most mobile use. - * - * @param clientId the client key id - * @return UGClient object for method call chaining - */ - public UGClient withClientId(String clientId) { - this.clientId = clientId; - return this; - } - - /** - * Gets the application (not organization) client secret credential for making calls as the - * application-owner. Not safe for most mobile use. - * @return the client secret - */ - public String getClientSecret() { - return clientSecret; - } - - /** - * Sets the application (not organization) client secret credential, used for making - * calls as the application-owner. Not safe for most mobile use. - * - * @param clientSecret the client secret - */ - public void setClientSecret(String clientSecret) { - this.clientSecret = clientSecret; - } - - /** - * Sets the client secret credential in the UGClient object. Not safe for most mobile use. - * - * @param clientSecret the client secret - * @return UGClient object for method call chaining - */ - public UGClient withClientSecret(String clientSecret) { - this.clientSecret = clientSecret; - return this; - } - - /** - * Gets the UUID of the logged-in user after a successful authorizeAppUser request - * @return the UUID of the logged-in user - */ - public User getLoggedInUser() { - return loggedInUser; - } - - /** - * Sets the UUID of the logged-in user. Usually not set by host application - * @param loggedInUser the UUID of the logged-in user - */ - public void setLoggedInUser(User loggedInUser) { - this.loggedInUser = loggedInUser; - } - - /** - * Gets the OAuth2 access token for the current logged-in user after a - * successful authorize request - * - * @return the OAuth2 access token - */ - public String getAccessToken() { - return accessToken; - } - - /** - * Saves the OAuth2 access token in the UGClient after a successful authorize - * request. Usually not set by host application. - * - * @param accessToken an OAuth2 access token - */ - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - /** - * Gets the current organization from UGClient - * - * @return the currentOrganization - */ - public String getCurrentOrganization() { - return currentOrganization; - } - - /** - * Sets the current organizanization from UGClient - * - * @param currentOrganization The organization this data client should use. - */ - public void setCurrentOrganization(String currentOrganization) { - this.currentOrganization = currentOrganization; - } - - /****************** LOGGING ***********************/ - /****************** LOGGING ***********************/ - - - /** - * Logs a trace-level logging message with tag 'DATA_CLIENT' - * - * @param logMessage the message to log - */ - public void logTrace(String logMessage) { - if( logMessage != null ) { - Log.v(LOGGING_TAG,logMessage); - } - } - - /** - * Logs a debug-level logging message with tag 'DATA_CLIENT' - * - * @param logMessage the message to log - */ - public void logDebug(String logMessage) { - if( logMessage != null ) { - Log.d(LOGGING_TAG,logMessage); - } - } - - /** - * Logs an info-level logging message with tag 'DATA_CLIENT' - * - * @param logMessage the message to log - */ - public void logInfo(String logMessage) { - if( logMessage != null ) { - Log.i(LOGGING_TAG,logMessage); - } - } - - /** - * Logs a warn-level logging message with tag 'DATA_CLIENT' - * - * @param logMessage the message to log - */ - public void logWarn(String logMessage) { - if( logMessage != null ) { - Log.w(LOGGING_TAG,logMessage); - } - } - - /** - * Logs an error-level logging message with tag 'DATA_CLIENT' - * - * @param logMessage the message to log - */ - public void logError(String logMessage) { - if( logMessage != null ) { - Log.e(LOGGING_TAG,logMessage); - } - } - - /** - * Logs a debug-level logging message with tag 'DATA_CLIENT' - * - * @param logMessage the message to log - */ - public void writeLog(String logMessage) { - if( logMessage != null ) { - //TODO: do we support different log levels in this class? - Log.d(LOGGING_TAG, logMessage); - } - } - - /****************** API/HTTP REQUEST ***********************/ - /****************** API/HTTP REQUEST ***********************/ - - /** - * Forms and initiates a raw synchronous http request and processes the response. - * - * @param httpMethod the HTTP method in the format: - * HTTP_METHOD_<method_name> (e.g. HTTP_METHOD_POST) - * @param params the URL parameters to append to the request URL - * @param data the body of the request - * @param segments additional URL path segments to append to the request URL - * @return ApiResponse object - */ - public ApiResponse doHttpRequest(String httpMethod, Map<String, Object> params, Object data, String... segments) { - - ApiResponse response = null; - OutputStream out = null; - InputStream in = null; - HttpURLConnection conn = null; - - String urlAsString = path(apiUrl, segments); - - try { - String contentType = "application/json"; - if (httpMethod.equals(HTTP_METHOD_POST) && isEmpty(data) && !isEmpty(params)) { - data = encodeParams(params); - contentType = "application/x-www-form-urlencoded"; - } else { - urlAsString = addQueryParams(urlAsString, params); - } - - //logTrace("Invoking " + httpMethod + " to '" + urlAsString + "'"); - conn = (HttpURLConnection) urlConnectionFactory.openConnection(urlAsString); - - conn.setRequestMethod(httpMethod); - conn.setRequestProperty("Content-Type", contentType); - conn.setUseCaches(false); - - if ((accessToken != null) && (accessToken.length() > 0)) { - String authStr = "Bearer " + accessToken; - conn.setRequestProperty("Authorization", authStr); - } - - conn.setDoInput(true); - - if (httpMethod.equals(HTTP_METHOD_POST) || httpMethod.equals(HTTP_METHOD_PUT)) { - if (isEmpty(data)) { - data = JsonNodeFactory.instance.objectNode(); - } - - String dataAsString = null; - - if ((data != null) && (!(data instanceof String))) { - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - dataAsString = objectMapper.writeValueAsString(data); - } else { - dataAsString = (String) data; - } - - //logTrace("Posting/putting data: '" + dataAsString + "'"); - - byte[] dataAsBytes = dataAsString.getBytes(); - - conn.setRequestProperty("Content-Length", Integer.toString(dataAsBytes.length)); - conn.setDoOutput(true); - - out = conn.getOutputStream(); - out.write(dataAsBytes); - out.flush(); - out.close(); - out = null; - } - - in = conn.getInputStream(); - if( in != null ) { - BufferedReader reader = new BufferedReader(new InputStreamReader(in)); - StringBuilder sb = new StringBuilder(); - String line; - - while( (line = reader.readLine()) != null ) { - sb.append(line); - sb.append('\n'); - } - - String responseAsString = sb.toString(); - - //logTrace("response from server: '" + responseAsString + "'"); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - response = (ApiResponse) objectMapper.readValue(responseAsString, ApiResponse.class); - response.setRawResponse(responseAsString); - - response.setUGClient(this); - } else { - response = null; - logTrace("no response body from server"); - } - - //final int responseCode = conn.getResponseCode(); - //logTrace("responseCode from server = " + responseCode); - } - catch(Exception e) { - logError("Error " + httpMethod + " to '" + urlAsString + "'" ); - if( e != null ) { - e.printStackTrace(); - logError(e.getLocalizedMessage()); - } - response = null; - } - catch(Throwable t) { - logError("Error " + httpMethod + " to '" + urlAsString + "'" ); - if( t != null ) { - t.printStackTrace(); - logError(t.getLocalizedMessage()); - } - response = null; - } - finally { - try { - if( out != null ) { - out.close(); - } - - if( in != null ) { - in.close(); - } - - if( conn != null ) { - conn.disconnect(); - } - } catch(Exception ignored) { - } - } - - return response; - } - - - /** - * High-level synchronous API request. Implements the http request - * for most SDK methods by calling - * {@link #doHttpRequest(String,Map,Object,String...)} - * - * @param httpMethod the HTTP method in the format: - * HTTP_METHOD_<method_name> (e.g. HTTP_METHOD_POST) - * @param params the URL parameters to append to the request URL - * @param data the body of the request - * @param segments additional URL path segments to append to the request URL - * @return ApiResponse object - */ - public ApiResponse apiRequest(String httpMethod, - Map<String, Object> params, Object data, String... segments) { - ApiResponse response = null; - - response = doHttpRequest(httpMethod, params, data, segments); - - if( (response == null) ) { - logError("doHttpRequest returned null"); - } - - return response; - } - - protected void assertValidApplicationId() { - if (isEmpty(applicationId)) { - throw new IllegalArgumentException("No application id specified"); - } - } - - /****************** ROLES/PERMISSIONS ***********************/ - /****************** ROLES/PERMISSIONS ***********************/ - - /** - * Assigns permissions to the specified user, group, or role. - * - * @param entityType the entity type of the entity the permissions are being assigned to. 'user', 'group' and 'role' are valid. - * @param entityID the UUID of 'name' property of the entity the permissions are being assigned to. - * @param permissions a comma-separated list of the permissions to be assigned in the format: <operations>:<path>, e.g. get, put, post, delete: /users - * @throws IllegalArgumentException thrown if an entityType other than 'group' or 'user' is passed to the method - * @return ApiResponse object - */ - public ApiResponse assignPermissions(String entityType, String entityID, String permissions) { - - if (!entityType.substring(entityType.length() - 1 ).equals("s")) { - entityType += "s"; - } - - if (!validateTypeForPermissionsAndRoles(entityType, "permission")) { - throw new IllegalArgumentException("Permissions can only be assigned to group, user, or role entities"); - } - - Map<String, Object> data = new HashMap<String, Object>(); - if (permissions != null){ - data.put("permission", permissions); - } - - return apiRequest(HTTP_METHOD_POST, null, data, organizationId, applicationId, entityType, - entityID, "permissions"); - - } - - /** - * Assigns permissions to the specified user, group, or role. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param entityType the entity type of the entity the permissions are being assigned to. 'user', 'group' and 'role' are valid. - * @param entityID the UUID of 'name' property of the entity the permissions are being assigned to. - * @param permissions a comma-separated list of the permissions to be assigned in the format: <operations>:<path>, e.g. get, put, post, delete: /users - * @param callback an ApiResponseCallback to handle the async response - */ - public void assignPermissionsAsync(final String entityType, - final String entityID, final String permissions, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return assignPermissions(entityType, entityID, permissions); - } - }).execute(); - } - - /** - * Removes permissions from the specified user, group or role. - * - * @param entityType the entity type of the entity the permissions are being removed from. 'user', 'group' and 'role' are valid. - * @param entityID the UUID of 'name' property of the entity the permissions are being removed from. - * @param permissions a comma-separated list of the permissions to be removed in the format: <operations>:<path>, e.g. get, put, post, delete: /users - * @throws IllegalArgumentException thrown if an entityType other than 'group' or 'user' is passed to the method - * @return ApiResponse object - */ - public ApiResponse removePermissions(String entityType, String entityID, String permissions) { - - if (!validateTypeForPermissionsAndRoles(entityType, "permission")) { - throw new IllegalArgumentException("Permissions can only be assigned to group, user, or role entities"); - } - - Map<String, Object> params = new HashMap<String, Object>(); - if (permissions != null){ - params.put("permission", permissions); - } - - return apiRequest(HTTP_METHOD_DELETE, params, null, organizationId, applicationId, entityType, - entityID, "permissions"); - - } - - /** - * Removes permissions from the specified user, group or role. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param entityType the entity type of the entity the permissions are being removed from. 'user', 'group', and 'role' are valid. - * @param entityID the UUID of 'name' property of the entity the permissions are being removed from. - * @param permissions a comma-separated list of the permissions to be removed in the format: <operations>:<path>, e.g. get, put, post, delete: /users - * @param callback an ApiResponseCallback to handle the async response - */ - public void removePermissionsAsync(final String entityType, - final String entityID, final String permissions, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return removePermissions(entityType, entityID, permissions); - } - }).execute(); - } - - /** - * Creates a new role and assigns permissions to it. - * - * @param roleName the name of the new role - * @param permissions a comma-separated list of the permissions to be assigned in the format: <operations>:<path>, e.g. get, put, post, delete: /users - * @return ApiResponse object - */ - public ApiResponse createRole(String roleName, String permissions) { - - Map<String, Object> properties = new HashMap<String, Object>(); - properties.put("type", "role"); - properties.put("name", roleName); - - ApiResponse response = this.createEntity(properties); - - String uuid = null; - - if (response.getEntityCount() == 1){ - uuid = response.getFirstEntity().getUuid().toString(); - } - - return assignPermissions("role", uuid, permissions); - - } - - /** - * Creates a new role and assigns permissions to it. - * - * @param roleName the name of the new role - * @param permissions a comma-separated list of the permissions to be assigned in the format: <operations>:<path>, e.g. get, put, post, delete: /users - * @param callback an ApiResponseCallback to handle the async response - */ - public void createRoleAsync(final String roleName, final String permissions, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return createRole(roleName, permissions); - } - }).execute(); - } - - /** - * Assigns a role to a user or group entity. - * - * @param roleName the name of the role to be assigned to the entity - * @param entityType the entity type of the entity the role is being assigned to. 'user' and 'group' are valid. - * @param entityID the UUID or 'name' property of the entity the role is being assigned to. - * @throws IllegalArgumentException thrown if an entityType other than 'group' or 'user' is passed to the method - * @return ApiResponse object - */ - public ApiResponse assignRole(String roleName, String entityType, String entityID) { - - if (!entityType.substring(entityType.length() - 1 ).equals("s")) { - entityType += "s"; - } - - if (!validateTypeForPermissionsAndRoles(entityType, "role")) { - throw new IllegalArgumentException("Permissions can only be assigned to a group or user"); - } - - return apiRequest(HTTP_METHOD_POST, null, null, organizationId, applicationId, "roles", roleName, - entityType, entityID); - - } - - /** - * Assigns a role to a user or group entity. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param roleName the name of the role to be assigned to the entity - * @param entityType the entity type of the entity the role is being assigned to. 'user' and 'group' are valid. - * @param entityID the UUID or 'name' property of the entity the role is being removed from. - * @param callback an ApiResponseCallback to handle the async response - */ - public void assignRoleAsync(final String roleName, final String entityType, - final String entityID, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return assignRole(roleName, entityType, entityID); - } - }).execute(); - } - - /** - * Removes a role from a user or group entity. - * - * @param roleName the name of the role to be removed from the entity - * @param entityType the entity type of the entity the role is being removed from. 'user' and 'group' are valid. - * @param entityID the UUID or 'name' property of the entity the role is being removed from. - * @throws IllegalArgumentException thrown if an entityType other than 'group' or 'user' is passed to the method - * @return ApiResponse object - */ - public ApiResponse removeRole(String roleName, String entityType, String entityID) { - - if (!entityType.substring(entityType.length() - 1 ).equals("s")) { - entityType += "s"; - } - - if (!validateTypeForPermissionsAndRoles(entityType, "role")) { - throw new IllegalArgumentException("Permissions can only be removed from a group or user"); - } - - return apiRequest(HTTP_METHOD_DELETE, null, null, organizationId, applicationId, "roles", roleName, - entityType, entityID); - - } - - /** - * Removes a role from a user or group entity. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param roleName the name of the role to be removed from the entity - * @param entityType the entity type of the entity the role is being removed from. 'user' and 'group' are valid. - * @param entityID the UUID or 'name' property of the entity the role is being removed from. - * @param callback an ApiResponseCallback to handle the async response - */ - public void removeRoleAsync(final String roleName, final String entityType, - final String entityID, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return removeRole(roleName, entityType, entityID); - } - }).execute(); - } - - /** - * Checks if a permission or role can be assigned to an entity - * @y.exclude - */ - private Boolean validateTypeForPermissionsAndRoles(String type, String permissionOrRole){ - ArrayList<String> validTypes = new ArrayList<String>(); - validTypes.add("groups"); - validTypes.add("users"); - - if (permissionOrRole.equals("permission")){ - validTypes.add("roles"); - } - - return validTypes.contains(type); - } - - /****************** LOG IN/LOG OUT/OAUTH ***********************/ - /****************** LOG IN/LOG OUT/OAUTH ***********************/ - - /** - * Logs the user in and get a valid access token. - * - * @param usernameOrEmail the username or email associated with the user entity in Usergrid - * @param password the user's Usergrid password - * @return non-null ApiResponse if request succeeds, check getError() for - * "invalid_grant" to see if access is denied. - */ - public ApiResponse authorizeAppUser(String usernameOrEmail, String password) { - validateNonEmptyParam(usernameOrEmail, "email"); - validateNonEmptyParam(password,"password"); - assertValidApplicationId(); - loggedInUser = null; - accessToken = null; - currentOrganization = null; - Map<String, Object> formData = new HashMap<String, Object>(); - formData.put("grant_type", "password"); - formData.put("username", usernameOrEmail); - formData.put("password", password); - ApiResponse response = apiRequest(HTTP_METHOD_POST, formData, null, - organizationId, applicationId, "token"); - if (response == null) { - return response; - } - if (!isEmpty(response.getAccessToken()) && (response.getUser() != null)) { - loggedInUser = response.getUser(); - accessToken = response.getAccessToken(); - currentOrganization = null; - logInfo("authorizeAppUser(): Access token: " + accessToken); - } else { - logInfo("authorizeAppUser(): Response: " + response); - } - return response; - } - - /** - * Log the user in and get a valid access token. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param usernameOrEmail the username or email associated with the user entity in Usergrid - * @param password the users Usergrid password - * @param callback an ApiResponseCallback to handle the async response - */ - public void authorizeAppUserAsync(final String usernameOrEmail, - final String password, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return authorizeAppUser(usernameOrEmail, password); - } - }).execute(); - } - - /** - * Change the password for the currently logged in user. You must supply the - * old password and the new password. - * - * @param username the username or email address associated with the user entity in Usergrid - * @param oldPassword the user's old password - * @param newPassword the user's new password - * @return ApiResponse object - */ - public ApiResponse changePassword(String username, String oldPassword, - String newPassword) { - - Map<String, Object> data = new HashMap<String, Object>(); - data.put("newpassword", newPassword); - data.put("oldpassword", oldPassword); - - return apiRequest(HTTP_METHOD_POST, null, data, organizationId, applicationId, "users", - username, "password"); - - } - - public void changePasswordAsync(final String username, final String oldPassword, - final String newPassword, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return changePassword(username, oldPassword, newPassword); - } - }).execute(); - } - - /** - * Log the user in with their numeric pin-code and get a valid access token. - * - * @param email the email address associated with the user entity in Usergrid - * @param pin the pin associated with the user entity in Usergrid - * @return non-null ApiResponse if request succeeds, check getError() for - * "invalid_grant" to see if access is denied. - */ - public ApiResponse authorizeAppUserViaPin(String email, String pin) { - validateNonEmptyParam(email, "email"); - validateNonEmptyParam(pin, "pin"); - assertValidApplicationId(); - loggedInUser = null; - accessToken = null; - currentOrganization = null; - Map<String, Object> formData = new HashMap<String, Object>(); - formData.put("grant_type", "pin"); - formData.put("username", email); - formData.put("pin", pin); - ApiResponse response = apiRequest(HTTP_METHOD_POST, formData, null, - organizationId, applicationId, "token"); - if (response == null) { - return response; - } - if (!isEmpty(response.getAccessToken()) && (response.getUser() != null)) { - loggedInUser = response.getUser(); - accessToken = response.getAccessToken(); - currentOrganization = null; - logInfo("authorizeAppUser(): Access token: " + accessToken); - } else { - logInfo("authorizeAppUser(): Response: " + response); - } - return response; - } - - /** - * Log the user in with their numeric pin-code and get a valid access token. - * Executes asynchronously in background and the callbacks are called in the - * UI thread. - * - * @param email the email address associated with the user entity in Usergrid - * @param pin the pin associated with the user entity in Usergrid - * @param callback A callback for the async response. - */ - public void authorizeAppUserViaPinAsync(final String email, - final String pin, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return authorizeAppUserViaPin(email, pin); - } - }).execute(); - } - - /** - * Log the app in with it's application (not organization) client id and - * client secret key. Not recommended for production apps. Executes asynchronously - * in background and the callbacks are called in the UI thread. - * - * @param clientId the Usergrid application's client ID - * @param clientSecret the Usergrid application's client secret - * @param callback an ApiResponseCallback to handle the async response - */ - public void authorizeAppClientAsync(final String clientId, - final String clientSecret, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - - @Override - public ApiResponse doTask() { - return authorizeAppClient(clientId, clientSecret); - } - }).execute(); - } - - private void validateNonEmptyParam(Object param, String paramName) { - if ( isEmpty(param) ) { - throw new IllegalArgumentException(paramName + " cannot be null or empty"); - } - } - - /** - * Log the user in with their Facebook access token retrieved via Facebook - * OAuth. Sets the user's identifier and Usergrid OAuth2 access token in UGClient - * if successfully authorized. - * - * @param fb_access_token the valid OAuth token returned by Facebook - * @return non-null ApiResponse if request succeeds, check getError() for - * "invalid_grant" to see if access is denied. - */ - public ApiResponse authorizeAppUserViaFacebook(String fb_access_token) { - validateNonEmptyParam(fb_access_token, "Facebook token"); - assertValidApplicationId(); - loggedInUser = null; - accessToken = null; - currentOrganization = null; - Map<String, Object> formData = new HashMap<String, Object>(); - formData.put("fb_access_token", fb_access_token); - ApiResponse response = apiRequest(HTTP_METHOD_POST, formData, null, - organizationId, applicationId, "auth", "facebook"); - if (response == null) { - return response; - } - if (!isEmpty(response.getAccessToken()) && (response.getUser() != null)) { - loggedInUser = response.getUser(); - accessToken = response.getAccessToken(); - currentOrganization = null; - logInfo("authorizeAppUserViaFacebook(): Access token: " - + accessToken); - } else { - logInfo("authorizeAppUserViaFacebook(): Response: " - + response); - } - return response; - } - - /** - * Log the user in with their Facebook access token retrieved via Facebook - * OAuth. Sets the user's identifier and Usergrid OAuth2 access token in UGClient - * if successfully authorized. Executes asynchronously in background and the - * callbacks are called in the UI thread. - * - * @param fb_access_token the valid OAuth token returned by Facebook - * @param callback an ApiResponseCallback to handle the async response - */ - public void authorizeAppUserViaFacebookAsync(final String fb_access_token, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return authorizeAppUserViaFacebook(fb_access_token); - } - }).execute(); - } - - /** - * Log out a user and destroy the access token currently stored in UGClient - * on the server and in the UGClient. - * - * @param username The username to be logged out - * @return non-null ApiResponse if request succeeds - */ - public ApiResponse logOutAppUser(String username) { - String token = getAccessToken(); - Map<String,Object> params = new HashMap<String,Object>(); - params.put("token",token); - ApiResponse response = apiRequest(HTTP_METHOD_PUT, params, null, - organizationId, applicationId, "users",username,"revoketoken?"); - if (response == null) { - return response; - } else { - logInfo("logoutAppUser(): Response: " + response); - setAccessToken(null); - } - return response; - } - - /** - * Log out a user and destroy the access token currently stored in UGClient - * on the server and in the UGClient. - * Executes asynchronously in background and the callbacks are called in the - * UI thread. - * - * @param username The username to be logged out - * @param callback an ApiResponseCallback to handle the async response - */ - public void logOutAppUserAsync(final String username, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return logOutAppUser(username); - } - }).execute(); - } - - /** - * Destroy a specific user token on the server. The token will also be cleared - * from the UGClient instance, if it matches the token provided. - * - * @param username The username to be logged out - * @param token The access token to be destroyed on the server - * @return non-null ApiResponse if request succeeds - */ - public ApiResponse logOutAppUserForToken(String username, String token) { - Map<String,Object> params = new HashMap<String,Object>(); - params.put("token",token); - ApiResponse response = apiRequest(HTTP_METHOD_PUT, params, null, - organizationId, applicationId, "users",username,"revoketoken?"); - if (response == null) { - return response; - } else { - logInfo("logoutAppWithTokenUser(): Response: " + response); - if (token.equals(getAccessToken())) { - setAccessToken(null); - } - } - return response; - } - - /** - * Destroy a specific user token on the server. The token will also be cleared - * from the UGClient instance, if it matches the token provided. - * Executes asynchronously in background and the callbacks are called in the UI thread. - * - * @param username The username to be logged out - * @param token The access token to be destroyed on the server - * @param callback A callback for the async response - */ - public void logOutAppUserForTokenAsync(final String username, final String token, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return logOutAppUserForToken(username, token); - } - }).execute(); - } - - /** - * Log out a user and destroy all associated tokens on the server. - * The token stored in UGClient will also be destroyed. - * - * @param username The username to be logged out - * @return non-null ApiResponse if request succeeds - */ - public ApiResponse logOutAppUserForAllTokens(String username) { - ApiResponse response = apiRequest(HTTP_METHOD_PUT, null, null, - organizationId, applicationId, "users",username,"revoketokens"); - if (response == null) { - return response; - } else { - logInfo("logoutAppUserForAllTokens(): Response: " + response); - setAccessToken(null); - } - return response; - } - - /** - * Log out a user and destroy all associated tokens on the server. - * The token stored in UGClient will also be destroyed. - * Executes asynchronously in background and the callbacks are called in the UI thread. - * - * @param username The username to be logged out - * @param callback A callback for the response - */ - public void logOutAppUserForAllTokensAsync(final String username, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return logOutAppUserForAllTokens(username); - } - }).execute(); - } - - /** - * Log the app in with it's application (not organization) client id and - * client secret key. Not recommended for production apps. - * - * @param clientId the Usergrid application's client ID - * @param clientSecret the Usergrid application's client secret - */ - public ApiResponse authorizeAppClient(String clientId, String clientSecret) { - validateNonEmptyParam(clientId, "client identifier"); - validateNonEmptyParam(clientSecret, "client secret"); - assertValidApplicationId(); - loggedInUser = null; - accessToken = null; - currentOrganization = null; - Map<String, Object> formData = new HashMap<String, Object>(); - formData.put("grant_type", "client_credentials"); - formData.put("client_id", clientId); - formData.put("client_secret", clientSecret); - ApiResponse response = apiRequest(HTTP_METHOD_POST, formData, null, - organizationId, applicationId, "token"); - if (response == null) { - return response; - } - if (!isEmpty(response.getAccessToken())) { - loggedInUser = null; - accessToken = response.getAccessToken(); - currentOrganization = null; - logInfo("authorizeAppClient(): Access token: " - + accessToken); - } else { - logInfo("authorizeAppClient(): Response: " + response); - } - return response; - } - - - /****************** GENERIC ENTITY MANAGEMENT ***********************/ - /****************** GENERIC ENTITY MANAGEMENT ***********************/ - - /** - * Create a new entity on the server. - * - * @param entity - * @return an ApiResponse with the new entity in it. - */ - public ApiResponse createEntity(Entity entity) { - assertValidApplicationId(); - if (isEmpty(entity.getType())) { - throw new IllegalArgumentException("Missing entity type"); - } - ApiResponse response = apiRequest(HTTP_METHOD_POST, null, entity, - organizationId, applicationId, entity.getType()); - return response; - } - - /** - * Create a new entity on the server from a set of properties. Properties - * must include a "type" property. - * - * @param properties - * @return an ApiResponse with the new entity in it. - */ - public ApiResponse createEntity(Map<String, Object> properties) { - assertValidApplicationId(); - if (isEmpty(properties.get("type"))) { - throw new IllegalArgumentException("Missing entity type"); - } - ApiResponse response = apiRequest(HTTP_METHOD_POST, null, properties, - organizationId, applicationId, properties.get("type").toString()); - return response; - } - - /** - * Create a new entity on the server. Executes asynchronously in background - * and the callbacks are called in the UI thread. - * - * @param entity An instance with data to use to create the entity - * @param callback A callback for the async response - */ - public void createEntityAsync(final Entity entity, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return createEntity(entity); - } - }).execute(); - } - - - /** - * Create a new entity on the server from a set of properties. Properties - * must include a "type" property. Executes asynchronously in background and - * the callbacks are called in the UI thread. - * - * @param properties The values to use, with keys as property names and values - * as property values - * @param callback A callback for the async response - */ - public void createEntityAsync(final Map<String, Object> properties, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return createEntity(properties); - } - }).execute(); - } - - /** - * Create a set of entities on the server from an ArrayList. Each item in the array - * contains a set of properties that define a entity. - * - * @param type The type of entities to create. - * @param entities A list of maps where keys are entity property names and values - * are property values. - * @return An instance with response data from the server. - */ - public ApiResponse createEntities(String type, ArrayList<Map<String, Object>> entities) { - assertValidApplicationId(); - if (isEmpty(type)) { - throw new IllegalArgumentException("Missing entity type"); - } - ApiResponse response = apiRequest(HTTP_METHOD_POST, null, entities, - organizationId, applicationId, type); - return response; - } - - /** - * Create a set of entities on the server from an ArrayList. Each item in the array - * contains a set of properties that define a entity. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param type The type of entities to create. - * @param entities A list of maps where keys are entity property names and values - * are property values. - * @param callback A callback for the async response - */ - public void createEntitiesAsync(final String type, final ArrayList<Map<String, Object>> entities, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return createEntities(type, entities); - } - }).execute(); - } - - /** - * Creates an object instance that corresponds to the provided entity type. - * Supported object types are Activity, Device, Group, Message, and User. - * All other types will return a generic Entity instance with no type assigned. - * - * @param type the entity type of which to create an object instance - * @return an object instance that corresponds to the type provided - */ - public Entity createTypedEntity(String type) { - Entity entity = null; - - if( Activity.isSameType(type) ) { - entity = new Activity(this); - } else if( Device.isSameType(type) ) { - entity = new Device(this); - } else if( Group.isSameType(type) ) { - entity = new Group(this); - } else if( Message.isSameType(type) ) { - entity = new Message(this); - } else if( User.isSameType(type) ) { - entity = new User(this); - } else { - entity = new Entity(this); - } - - return entity; - } - - /** - * Requests all entities of specified type that match the provided query string. - * - * @param type the entity type to be retrieved - * @param queryString a query string to send with the request - * @return a non-null ApiResponse object if successful - */ - public ApiResponse getEntities(String type,String queryString) - { - Map<String, Object> params = null; - - if (queryString.length() > 0) { - params = new HashMap<String, Object>(); - params.put("ql", queryString); - } - - return apiRequest(HTTP_METHOD_GET, // method - params, // params - null, // data - organizationId, - applicationId, - type); - } - - /** - * Asynchronously requests all entities of specified type that match the provided query string. - * - * @param type the entity type to be retrieved - * @param queryString a query string to send with the request - * @param callback an ApiResponseCallback to handle the async response - */ - public void getEntitiesAsync(final String type, - final String queryString, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return getEntities(type, queryString); - } - }).execute(); - } - - /** - * Update an existing entity on the server. - * - * @param entityID the entity to update - * @param updatedProperties the new properties - * @return an ApiResponse with the updated entity in it. - */ - public ApiResponse updateEntity(String entityID, Map<String, Object> updatedProperties) { - assertValidApplicationId(); - if (isEmpty(updatedProperties.get("type"))) { - throw new IllegalArgumentException("Missing entity type"); - } - ApiResponse response = apiRequest(HTTP_METHOD_PUT, null, updatedProperties, - organizationId, applicationId, updatedProperties.get("type").toString(), entityID); - return response; - } - - - /** - * Update an existing entity on the server. Properties - * must include a "type" property. Executes asynchronously in background and - * the callbacks are called in the UI thread. - * - * @param entityID the entity to update - * @param updatedProperties the new properties - * @param callback A callback for the async response - */ - public void updateEntityAsync(final String entityID, final Map<String, Object> updatedProperties, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return updateEntity(entityID, updatedProperties); - } - }).execute(); - } - - /** - * Updates the password associated with a user entity - * - * @param usernameOrEmail the username or email address associated with the user entity - * @param oldPassword the user's old password - * @param newPassword the user's new password - * @return an ApiResponse with the updated entity in it. - */ - public ApiResponse updateUserPassword(String usernameOrEmail, String oldPassword, String newPassword) { - Map<String,Object> updatedProperties = new HashMap<String,Object>(); - updatedProperties.put("oldpassword", oldPassword); - updatedProperties.put("newpassword", newPassword); - return apiRequest(HTTP_METHOD_POST, null, updatedProperties, - organizationId, applicationId, "users", usernameOrEmail); - } - - - /** - * Remove an existing entity on the server. - * - * @param entityType the collection of the entity - * @param entityID the specific entity to delete - * @return an ApiResponse indicating whether the removal was successful - */ - public ApiResponse removeEntity(String entityType, String entityID) { - assertValidApplicationId(); - if (isEmpty(entityType)) { - throw new IllegalArgumentException("Missing entity type"); - } - ApiResponse response = apiRequest(HTTP_METHOD_DELETE, null, null, - organizationId, applicationId, entityType, entityID); - return response; - } - - /** - * Remove an existing entity on the server. - * Executes asynchronously in background and - * the callbacks are called in the UI thread. - * - * @param entityType the collection of the entity - * @param entityID the specific entity to delete - * @param callback A callback with the async response - */ - public void removeEntityAsync(final String entityType, final String entityID, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return removeEntity(entityType, entityID); - } - }).execute(); - } - - /** - * Perform a query request and return a query object. The Query object - * provides a simple way of dealing with result sets that need to be - * iterated or paged through. - * - * See {@link #doHttpRequest(String,Map,Object,String...)} for - * more on the parameters. - * - * @param httpMethod The HTTP method to use in the query - * @param params Query parameters. - * @param data The request body. - * @param segments Additional URL path segments to append to the request URL - * @return An instance representing query results - */ - public Query queryEntitiesRequest(String httpMethod, - Map<String, Object> params, Object data, String... segments) { - ApiResponse response = apiRequest(httpMethod, params, data, segments); - return new EntityQuery(response, httpMethod, params, data, segments); - } - - /** - * Perform a query request and return a query object. The Query object - * provides a simple way of dealing with result sets that need to be - * iterated or paged through. Executes asynchronously in background and the - * callbacks are called in the UI thread. - * - * See {@link #doHttpRequest(String,Map,Object,String...)} for - * more on the parameters. - * - * @param callback A callback for the async response - * @param httpMethod The HTTP method to use in the query - * @param params Query parameters. - * @param data The request body. - * @param segments Additional URL path segments to append to the request URL - */ - public void queryEntitiesRequestAsync(final QueryResultsCallback callback, - final String httpMethod, final Map<String, Object> params, - final Object data, final String... segments) { - (new ClientAsyncTask<Query>(callback) { - @Override - public Query doTask() { - return queryEntitiesRequest(httpMethod, params, data, segments); - } - }).execute(); - } - - /** - * Query object for handling the response from certain query requests - * @y.exclude - */ - private class EntityQuery implements Query { - final String httpMethod; - final Map<String, Object> params; - final Object data; - final String[] segments; - final ApiResponse response; - - private EntityQuery(ApiResponse response, String httpMethod, - Map<String, Object> params, Object data, String[] segments) { - this.response = response; - this.httpMethod = httpMethod; - this.params = params; - this.data = data; - this.segments = segments; - } - - private EntityQuery(ApiResponse response, EntityQuery q) { - this.response = response; - httpMethod = q.httpMethod; - params = q.params; - data = q.data; - segments = q.segments; - } - - /** - * Gets the API response from the last request - * - * @return an ApiResponse object - */ - public ApiResponse getResponse() { - return response; - } - - /** - * Checks if there are more results available based on whether a - * 'cursor' property was present in the last result set. - * - * @return true if the server indicates more results are available - */ - public boolean more() { - if ((response != null) && (response.getCursor() != null) - && (response.getCursor().length() > 0)) { - return true; - } - return false; - } - - /** - * Performs a request for the next set of results based on the cursor - * from the last result set. - * - * @return query that contains results and where to get more. - */ - public Query next() { - if (more()) { - Map<String, Object> nextParams = null; - if (params != null) { - nextParams = new HashMap<String, Object>(params); - } else { - nextParams = new HashMap<String, Object>(); - } - nextParams.put("cursor", response.getCursor()); - ApiResponse nextResponse = apiRequest(httpMethod, nextParams, data, - segments); - return new EntityQuery(nextResponse, this); - } - return null; - } - - } - - - /****************** USER ENTITY MANAGEMENT ***********************/ - /****************** USER ENTITY MANAGEMENT ***********************/ - - /** - * Creates a user entity. - * - * @param username required. The username to be associated with the user entity. - * @param name the user's full name. Can be null. - * @param email the user's email address. - * @param password the user's password - * @return an ApiResponse object - */ - public ApiResponse createUser(String username, String name, String email, - String password) { - Map<String, Object> properties = new HashMap<String, Object>(); - properties.put("type", "user"); - if (username != null) { - properties.put("username", username); - } - if (name != null) { - properties.put("name", name); - } - if (email != null) { - properties.put("email", email); - } - if (password != null) { - properties.put("password", password); - } - return createEntity(properties); - } - - /** - * Creates a user. Executes asynchronously in background and the callbacks - * are called in the UI thread. - * - * @param username required. The username to be associated with the user entity. - * @param name the user's full name. Can be null. - * @param email the user's email address. - * @param password the user's password. - * @param callback an ApiResponse callback for handling the async response. - */ - public void createUserAsync(final String username, final String name, - final String email, final String password, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return createUser(username, name, email, password); - } - }).execute(); - } - - /** - * Retrieves the /users collection. - * - * @return a Query object - */ - public Query queryUsers() { - Query q = queryEntitiesRequest(HTTP_METHOD_GET, null, null, - organizationId, applicationId, "users"); - return q; - } - - /** - * Retrieves the /users collection. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param callback a QueryResultsCallback object to handle the async response - */ - public void queryUsersAsync(QueryResultsCallback callback) { - queryEntitiesRequestAsync(callback, HTTP_METHOD_GET, null, null, - organizationId, applicationId, "users"); - } - - - /** - * Performs a query of the users collection using the provided query command. - * For example: "name contains 'ed'". - * - * @param ql the query to execute - * @return a Query object - */ - public Query queryUsers(String ql) { - Map<String, Object> params = new HashMap<String, Object>(); - params.put("ql", ql); - Query q = queryEntitiesRequest(HTTP_METHOD_GET, params, null,organizationId, - applicationId, "users"); - return q; - } - - /** - * Perform a query of the users collection using the provided query command. - * For example: "name contains 'ed'". Executes asynchronously in background - * and the callbacks are called in the UI thread. - * - * @param ql the query to execute - * @param callback a QueryResultsCallback object to handle the async response - */ - public void queryUsersAsync(String ql, QueryResultsCallback callback) { - Map<String, Object> params = new HashMap<String, Object>(); - params.put("ql", ql); - queryEntitiesRequestAsync(callback, HTTP_METHOD_GET, params, null, - organizationId, applicationId, "users"); - } - - /** - * Perform a query of the users collection within the specified distance of - * the specified location and optionally using the provided additional query. - * For example: "name contains 'ed'". - * - * @param distance distance from the location in meters - * @param latitude the latitude of the location to measure from - * @param longitude the longitude of the location to measure from - * @param ql an optional additional query to send with the request - * @return a Query object - */ - public Query queryUsersWithinLocation(float distance, float latitude, - float longitude, String ql) { - Map<String, Object> params = new HashMap<String, Object>(); - params.put("ql", - this.makeLocationQL(distance, latitude, longitude, ql)); - Query q = queryEntitiesRequest(HTTP_METHOD_GET, params, null, organizationId, - applicationId, "users"); - return q; - } - - - /****************** GROUP ENTITY MANAGEMENT ***********************/ - /****************** GROUP ENTITY MANAGEMENT ***********************/ - - /** - * Creates a group with the specified group path. Group paths can be slash - * ("/") delimited like file paths for hierarchical group relationships. - * - * @param groupPath the path to use for the new group. - * @return an ApiResponse object - */ - public ApiResponse createGroup(String groupPath) { - return createGroup(groupPath, null); - } - - /** - * Creates a group with the specified group path and group title. Group - * paths can be slash ("/") delimited like file paths for hierarchical group - * relationships. - * - * @param groupPath the path to use for the new group - * @param groupTitle the title to use for the new group - * @return an ApiResponse object - */ - public ApiResponse createGroup(String groupPath, String groupTitle) { - return createGroup(groupPath, groupTitle, null); - } - - /** - * Create a group with a path, title and name. Group - * paths can be slash ("/") delimited like file paths for hierarchical group - * relationships. - * - * @param groupPath the path to use for the new group - * @param groupTitle the title to use for the new group - * @param groupName the name to use for the new group - * @return an ApiResponse object - */ - public ApiResponse createGroup(String groupPath, String groupTitle, String groupName){ - Map<String, Object> data = new HashMap<String, Object>(); - data.put("type", "group"); - data.put("path", groupPath); - - if (groupTitle != null) { - data.put("title", groupTitle); - } - - if(groupName != null){ - data.put("name", groupName); - } - - return apiRequest(HTTP_METHOD_POST, null, data, organizationId, applicationId, "groups"); - } - - /** - * Creates a group with the specified group path. Group paths can be slash - * ("/") delimited like file paths for hierarchical group relationships. - * Executes asynchronously in background and the callbacks are called in the - * UI thread. - * - * @param groupPath the path to use for the new group. - * @param callback an ApiResponseCallback object to handle the async response - */ - public void createGroupAsync(String groupPath, - final ApiResponseCallback callback) { - createGroupAsync(groupPath, null, null); - } - - /** - * Creates a group with the specified group path and group title. Group - * paths can be slash ("/") deliminted like file paths for hierarchical - * group relationships. Executes asynchronously in background and the - * callbacks are called in the UI thread. - * - * @param groupPath the path to use for the new group. - * @param groupTitle the title to use for the new group. - * @param callback an ApiResponseCallback object to handle the async response - */ - public void createGroupAsync(final String groupPath, - final String groupTitle, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return createGroup(groupPath, groupTitle); - } - }).execute(); - } - - /** - * Gets the groups associated with a user entity - * - * @param userId the UUID of the user entity - * @return a map with the group path as the key and a Group object as the value - */ - public Map<String, Group> getGroupsForUser(String userId) { - ApiResponse response = apiRequest(HTTP_METHOD_GET, null, null, - organizationId, applicationId, "users", userId, "groups"); - Map<String, Group> groupMap = new HashMap<String, Group>(); - if (response != null) { - List<Group> groups = response.getEntities(Group.class); - for (Group group : groups) { - groupMap.put(group.getPath(), group); - } - } - return groupMap; - } - - /** - * Gets the groups associated with a user entity. Executes asynchronously in background and - * the callbacks are called in the UI thread. - * - * @param userId the UUID of the user entity - * @param callback a GroupsRetrievedCallback object to handle the async response - */ - public void getGroupsForUserAsync(final String userId, - final GroupsRetrievedCallback callback) { - (new ClientAsyncTask<Map<String, Group>>(callback) { - @Override - public Map<String, Group> doTask() { - return getGroupsForUser(userId); - } - }).execute(); - } - - /** - * Gets the user entities associated with the specified group. - * - * @param groupId UUID of the group entity - * @return a Query object with the results of the query - */ - public Query queryUsersForGroup(String groupId) { - Query q = queryEntitiesRequest(HTTP_METHOD_GET, null, null, organizationId, - applicationId, "groups", groupId, "users"); - return q; - } - - /** - * Gets the user entities associated with the specified group. Executes - * asynchronously in background and the callbacks are called in the UI thread. - * - * @param groupId UUID of the group entity - * @param callback a QueryResultsCallback object to handle the async response - */ - public void queryUsersForGroupAsync(String groupId, - QueryResultsCallback callback) { - queryEntitiesRequestAsync(callback, HTTP_METHOD_GET, null, null, - getApplicationId(), "groups", groupId, "users"); - } - - /** - * Connects a user entity to the specified group entity. - * - * @param userId UUID of the user entity - * @param groupId UUID of the group entity - * @return an ApiResponse object - */ - public ApiResponse addUserToGroup(String userId, String groupId) { - return apiRequest(HTTP_METHOD_POST, null, null, organizationId, applicationId, "groups", - groupId, "users", userId); - } - - /** - * Connects a user entity to the specified group entity. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param userId UUID of the user entity - * @param groupId UUID of the group entity - * @param callback an ApiResponseCallback object to handle the async response - */ - public void addUserToGroupAsync(final String userId, final String groupId, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return addUserToGroup(userId, groupId); - } - }).execute(); - } - - /** - * Disconnects a user entity from the specified group entity. - * - * @param userId UUID of the user entity - * @param groupId UUID of the group entity - * @return an ApiResponse object - */ - public ApiResponse removeUserFromGroup(String userId, String groupId) { - return apiRequest(HTTP_METHOD_DELETE, null, null, organizationId, applicationId, "groups", - groupId, "users", userId); - } - - /** - * Disconnects a user entity from the specified group entity. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param userId UUID of the user entity - * @param groupId UUID of the group entity - * @param callback an ApiResponseCallback object to handle the async response - */ - public void removeUserFromGroupAsync(final String userId, final String groupId, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return removeUserFromGroup(userId, groupId); - } - }).execute(); - } - - /****************** ACTIVITY ENTITY MANAGEMENT ***********************/ - /****************** ACTIVITY ENTITY MANAGEMENT ***********************/ - - /** - * Get a user's activity feed. Returned as a query to ease paging. - * - * @param userId UUID of user entity - * @return a Query object - */ - public Query queryActivityFeedForUser(String userId) { - Query q = queryEntitiesRequest(HTTP_METHOD_GET, null, null, - organizationId, applicationId, "users", userId, "feed"); - return q; - } - - /** - * Get a user's activity feed. Returned as a query to ease paging. Executes - * asynchronously in background and the callbacks are called in the UI - * thread. - * - * - * @param userId UUID of user entity - * @param callback a QueryResultsCallback object to handle the async response - */ - public void queryActivityFeedForUserAsync(final String userId, final QueryResultsCallback callback) { - (new ClientAsyncTask<Query>(callback) { - @Override - public Query doTask() { - return queryActivityFeedForUser(userId); - } - }).execute(); - } - - - /** - * Posts an activity to a user entity's activity stream. Activity must already be created. - * - * @param userId - * @param activity - * @return An instance with the server response - */ - public ApiResponse postUserActivity(String userId, Activity activity) { - return apiRequest(HTTP_METHOD_POST, null, activity, organizationId, applicationId, "users", - userId, "activities"); - } - - /** - * Creates and posts an activity to a user entity's activity stream. - * - * @param verb - * @param title - * @param content - * @param category - * @param user - * @param object - * @param objectType - * @param objectName - * @param objectContent - * @return - */ - public ApiResponse postUserActivity(String verb, String title, - String content, String category, User user, Entity object, - String objectType, String objectName, String objectContent) { - Activity activity = Activity.newActivity(this, verb, title, content, - category, user, object, objectType, objectName, objectContent); - return postUserActivity(user.getUuid().toString(), activity); - } - - /** - * Creates and posts an activity to a user. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param verb - * @param title - * @param content - * @param category - * @param user - * @param object - * @param objectType - * @param objectName - * @param objectContent - * @param callback - */ - public void postUserActivityAsync(final String verb, final String title, - final String content, final String category, final User user, - final Entity object, final String objectType, - final String objectName, final String objectContent, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return postUserActivity(verb, title, content, category, user, - object, objectType, objectName, objectContent); - } - }).execute(); - } - - /** - * Posts an activity to a group. Activity must already be created. - * - * @param groupId - * @param activity - * @return - */ - public ApiResponse postGroupActivity(String groupId, Activity activity) { - return apiRequest(HTTP_METHOD_POST, null, activity, organizationId, applicationId, "groups", - groupId, "activities"); - } - - /** - * Creates and posts an activity to a group. - * - * @param groupId - * @param verb - * @param title - * @param content - * @param category - * @param user - * @param object - * @param objectType - * @param objectName - * @param objectContent - * @return - */ - public ApiResponse postGroupActivity(String groupId, String verb, String title, - String content, String category, User user, Entity object, - String objectType, String objectName, String objectContent) { - Activity activity = Activity.newActivity(this, verb, title, content, - category, user, object, objectType, objectName, objectContent); - return postGroupActivity(groupId, activity); - } - - /** - * Creates and posts an activity to a group. Executes asynchronously in - * background and the callbacks are called in the UI thread. - * - * @param groupId - * @param verb - * @param title - * @param content - * @param category - * @param user - * @param object - * @param objectType - * @param objectName - * @param objectContent - * @param callback - */ - public void postGroupActivityAsync(final String groupId, final String verb, final String title, - final String content, final String category, final User user, - final Entity object, final String objectType, - final String objectName, final String objectContent, - final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return postGroupActivity(groupId, verb, title, content, category, user, - object, objectType, objectName, objectContent); - } - }).execute(); - } - - /** - * Post an activity to the stream. - * - * @param activity - * @return - */ - public ApiResponse postActivity(Activity activity) { - return createEntity(activity); - } - - /** - * Creates and posts an activity to a group. - * - * @param verb - * @param title - * @param content - * @param category - * @param user - * @param object - * @param objectType - * @param objectName - * @param objectContent - * @return - */ - public ApiResponse postActivity(String verb, String title, - String content, String category, User user, Entity object, - String objectType, String objectName, String objectContent) { - Activity activity = Activity.newActivity(this, verb, title, content, - category, user, object, objectType, objectName, objectContent); - return createEntity(activity); - } - - /** - * Get a group's activity feed. Returned as a query to ease paging. - * - * @return - */ - public Query queryActivity() { - Query q = queryEntitiesRequest(HTTP_METHOD_GET, null, null, - organizationId, applicationId, "activities"); - return q; - } - - - - /** - * Get a group's activity feed. Returned as a query to ease paging. - * - * @param groupId - * @return - */ - public Query queryActivityFeedForGroup(String groupId) { - Query q = queryEntitiesRequest(HTTP_METHOD_GET, null, null, - organizationId, applicationId, "groups", groupId, "feed"); - return q; - } - - /** - * Get a group's activity feed. Returned as a query to ease paging. Executes - * asynchronously in background and the callbacks are called in the UI - * thread. - * - * - * @param groupId - * @param callback - */ - public void queryActivityFeedForGroupAsync(final String groupId, - final QueryResultsCallback callback) { - (new ClientAsyncTask<Query>(callback) { - @Override - public Query doTask() { - return queryActivityFeedForGroup(groupId); - } - }).execute(); - } - - - /****************** ENTITY CONNECTIONS ***********************/ - /****************** ENTITY CONNECTIONS ***********************/ - - /** - * Connect two entities together. - * - * @param connectingEntityType The type of the first entity. - * @param connectingEntityId The ID of the first entity. - * @param connectionType The type of connection between the entities. - * @param connectedEntityId The ID of the second entity. - * @return An instance with the server's response. - */ - public ApiResponse connectEntities(String connectingEntityType, - String connectingEntityId, String connectionType, - String connectedEntityId) { - return apiRequest(HTTP_METHOD_POST, null, null, organizationId, applicationId, - connectingEntityType, connectingEntityId, connectionType, - connectedEntityId); - } - - /** - * Connect two entities together - * - * @param connectorType The type of the first entity in the connection. - * @param connectorID The first entity's ID. - * @param connectionType The type of connection to make. - * @param connecteeType The type of the second entity. - * @param connecteeID The second entity's ID - * @return An instance with the server's response. - */ - public ApiResponse connectEntities(String connectorType, - String connectorID, - String connectionType, - String connecteeType, - String connecteeID) { - return apiRequest(HTTP_METHOD_POST, null, null, organizationId, applicationId, - connectorType, connectorID, connectionType, connecteeType, connecteeID); - } - - - /** - * Connect two entities together. Executes asynchronously in background and - * the callbacks are called in the UI thread. - * - * @param connectingEntityType The type of the first entity. - * @param connectingEntityId The UUID or 'name' property of the first entity. - * @param connectionType The type of connection between the entities. - * @param connectedEntityId The UUID of the second entity. - * @param callback A callback with the async response. - */ - public void connectEntitiesAsync(final String connectingEntityType, - final String connectingEntityId, final String connectionType, - final String connectedEntityId, final ApiResponseCallback callback) { - (new ClientAsyncTask<ApiResponse>(callback) { - @Override - public ApiResponse doTask() { - return connectEntities(connectingEntityType, - connectingEntityId, connectionType, connectedEntityId); - } - }).execute(); - } - - /** - * Connect two entities together. Allows the 'name' of the connected entity - * to be specified but requires the type also be specified. Executes asynchronously - * in background and the callbacks are called in the UI thread. - * - * @param connectingEntityType The type of the first entity. - * @param connectingEntityId The UUID or 'name' property of the first entity. - * @param connectionType The type of connection between the entities. - * @param connectedEntityType The type of connection between the entities. - * @param connectedEntityId The UUID or 'name' property of the second entity. - * @param callback A callback with the async response. - */ - public void connectEntitiesAsync(final String connectingEntityType, - final String connectingEntityId, final String connectionType, - final String connectedEntityType, final String c
<TRUNCATED>
