usergrid-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mru...@apache.org
Subject [03/12] usergrid git commit: Removing old android SDK.
Date Fri, 02 Sep 2016 17:25:25 GMT
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>

Mime
View raw message