You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by mr...@apache.org on 2016/09/02 17:25:25 UTC
[03/12] usergrid git commit: Removing old android SDK.
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>