You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by to...@apache.org on 2014/09/29 22:52:53 UTC

[14/52] [abbrv] fix create collections

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/dc3e36c2/portal/js/libs/usergrid.sdk.js
----------------------------------------------------------------------
diff --git a/portal/js/libs/usergrid.sdk.js b/portal/js/libs/usergrid.sdk.js
index 824f293..795e3e2 100755
--- a/portal/js/libs/usergrid.sdk.js
+++ b/portal/js/libs/usergrid.sdk.js
@@ -1,278 +1,293 @@
 /*
-*  This module is a collection of classes designed to make working with
-*  the Appigee App Services API as easy as possible.
-*  Learn more at http://apigee.com/docs/usergrid
-*
-*   Copyright 2012 Apigee Corporation
-*
-*  Licensed 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.
-*
-*  @author rod simpson (rod@apigee.com)
-*/
-(function(window, localStorage){
+ *  This module is a collection of classes designed to make working with
+ *  the Appigee App Services API as easy as possible.
+ *  Learn more at http://apigee.com/docs/usergrid
+ *
+ *   Copyright 2012 Apigee Corporation
+ *
+ *  Licensed 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.
+ *
+ *  @author rod simpson (rod@apigee.com)
+ */
+(function(window, localStorage) {
 
 
-//Hack around IE console.log
-window.console = window.console || {};
-window.console.log = window.console.log || function() {};
+  //Hack around IE console.log
+  window.console = window.console || {};
+  window.console.log = window.console.log || function() {};
 
-//Usergrid namespace encapsulates this SDK
-window.Usergrid = window.Usergrid || {};
-Usergrid = Usergrid || {};
-Usergrid.SDK_VERSION = '0.10.07';
-Usergrid.browser = Usergrid.browser || {};
+  //Usergrid namespace encapsulates this SDK
+  window.Usergrid = window.Usergrid || {};
+  Usergrid = Usergrid || {};
+  Usergrid.SDK_VERSION = '0.10.07';
+  Usergrid.browser = Usergrid.browser || {};
 
-Usergrid.Client = function(options,url) {
-  //usergrid enpoint
-  this.URI = url || 'https://api.usergrid.com';
+  Usergrid.Client = function(options, url) {
+    //usergrid enpoint
+    this.URI = url || 'https://api.usergrid.com';
 
-  //Find your Orgname and Appname in the Admin portal (http://apigee.com/usergrid)
-  if (options.orgName) {
-    this.set('orgName', options.orgName);
-  }
-  if (options.appName) {
-    this.set('appName', options.appName);
-  }
+    //Find your Orgname and Appname in the Admin portal (http://apigee.com/usergrid)
+    if (options.orgName) {
+      this.set('orgName', options.orgName);
+    }
+    if (options.appName) {
+      this.set('appName', options.appName);
+    }
 
-  if(options.keys){
-    this._keys = options.keys;
-  }
+    if (options.keys) {
+      this._keys = options.keys;
+    }
 
-  //other options
-  this.buildCurl = options.buildCurl || false;
-  this.logging = options.logging || false;
+    //other options
+    this.buildCurl = options.buildCurl || false;
+    this.logging = options.logging || false;
 
-  //timeout and callbacks
-  this._callTimeout =  options.callTimeout || 30000; //default to 30 seconds
-  this._callTimeoutCallback =  options.callTimeoutCallback || null;
-  this.logoutCallback =  options.logoutCallback || null;
-};
+    //timeout and callbacks
+    this._callTimeout = options.callTimeout || 30000; //default to 30 seconds
+    this._callTimeoutCallback = options.callTimeoutCallback || null;
+    this.logoutCallback = options.logoutCallback || null;
+  };
 
-/*
-*  Main function for making requests to the API.  Can be called directly.
-*
-*  options object:
-*  `method` - http method (GET, POST, PUT, or DELETE), defaults to GET
-*  `qs` - object containing querystring values to be appended to the uri
-*  `body` - object containing entity body for POST and PUT requests
-*  `endpoint` - API endpoint, for example 'users/fred'
-*  `mQuery` - boolean, set to true if running management query, defaults to false
-*
-*  @method request
-*  @public
-*  @params {object} options
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*/
-Usergrid.Client.prototype.request = function (options, callback) {
-  callback = callback || function(){console.error('no callback handed to client.request().')};
-  var self = this;
-  var method = options.method || "GET";
-  var endpoint = options.endpoint;
-  var body = options.body || {};
-  var qs = options.qs || {};
-  var mQuery = options.mQuery || false;
-  //is this a query to the management endpoint?
-  var orgName = this.get("orgName");
-  var appName = this.get("appName");
-  if (!mQuery && !orgName && !appName) {
-    if (typeof this.logoutCallback === "function") {
-      return this.logoutCallback(true, "no_org_or_app_name_specified");
-    }
-  }
-  var uri;
-  if (mQuery) {
-    uri = this.URI + "/" + endpoint;
-  } else {
-    uri = this.URI + "/" + orgName + "/" + appName + "/" + endpoint;
-  }
-  if (self.getToken()) {
-    qs.access_token = self.getToken();
-  }
-  var developerkey=self.get("developerkey");
-  if (developerkey) {
-    qs.key = developerkey;  
-  }
-
-  var isIE9 = Usergrid.browser.isIE9 = $.browser.msie && $.browser.version <= 9;
-  
-  (isIE9) && (method === 'PUT' || method === 'DELETE') && (function(){ qs['method_override'] = method;})();
-  
-  //append params to the path
-  var encoded_params = encodeParams(qs);
-  if (encoded_params) {
-    uri += "?" + encoded_params;
-  }
-  //stringify the body object
-  body = options.formData ? null : JSON.stringify(body);
-  //so far so good, so run the query
-  //*** ie9 hack
-  var xhr;
-  //check to see if ie9 - if so, convert delete and put calls to a POST
-  if (isIE9) { //XDomainRequest
-    xhr = new XDomainRequest();
-    (method === 'PUT' || method === 'DELETE') && (function() { method = 'POST';})();
-    xhr.open(method, uri);
-  }else{
-    xhr = new XMLHttpRequest();
-    xhr.open(method, uri, true);
-    //add content type = json if there is a json payload
-    if (!options.formData) {
-      xhr.setRequestHeader("Content-Type", "application/json");
-      xhr.setRequestHeader("Accept", "application/json");
-    }
-  }
-  xhr.isIE9 = isIE9;
-  // Handle response.
-  xhr.onerror = function(response) {
-    self._end = new Date().getTime();
-    if (self.logging) {
-      console.log("success (time: " + self.calcTimeDiff() + "): " + method + " " + uri);
-    }
-    if (self.logging) {
-      console.log("Error: API call failed at the network level.");
-    }
-    //network error
-    clearTimeout(timeout);
-    var err = true;
-    if (typeof callback === "function") {
-      callback(err, response);
+  /*
+   *  Main function for making requests to the API.  Can be called directly.
+   *
+   *  options object:
+   *  `method` - http method (GET, POST, PUT, or DELETE), defaults to GET
+   *  `qs` - object containing querystring values to be appended to the uri
+   *  `body` - object containing entity body for POST and PUT requests
+   *  `endpoint` - API endpoint, for example 'users/fred'
+   *  `mQuery` - boolean, set to true if running management query, defaults to false
+   *
+   *  @method request
+   *  @public
+   *  @params {object} options
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.request = function(options, callback) {
+    callback = callback || function() {
+      console.error('no callback handed to client.request().')
+    };
+    var self = this;
+    var method = options.method || "GET";
+    var endpoint = options.endpoint;
+    var body = options.body || {};
+    var qs = options.qs || {};
+    var mQuery = options.mQuery || false;
+    //is this a query to the management endpoint?
+    var orgName = this.get("orgName");
+    var appName = this.get("appName");
+    if (!mQuery && !orgName && !appName) {
+      if (typeof this.logoutCallback === "function") {
+        return this.logoutCallback(true, "no_org_or_app_name_specified");
+      }
     }
-  };
-  xhr.onload = function(response) {
-    //call timing, get time, then log the call
-    self._end = new Date().getTime();
-    if (self.logging) {
-      console.log("success (time: " + self.calcTimeDiff() + "): " + method + " " + uri);
-    }
-    //call completed
-    clearTimeout(timeout);
-    //decode the response
-    try {
-      response = JSON.parse(xhr.responseText);
-    } catch (e) {
-      response = {
-        error: "unhandled_error",
-        error_description: xhr.responseText
-      };
-      xhr.status = xhr.status === 200 ? 400 : xhr.status;
-      console.error(e);
+    var uri;
+    if (mQuery) {
+      uri = this.URI + "/" + endpoint;
+    } else {
+      uri = this.URI + "/" + orgName + "/" + appName + "/" + endpoint;
+    }
+    if (self.getToken()) {
+      qs.access_token = self.getToken();
+    }
+    var developerkey = self.get("developerkey");
+    if (developerkey) {
+      qs.key = developerkey;
+    }
+
+    var isIE9 = Usergrid.browser.isIE9 = $.browser.msie && $.browser.version <=
+      9;
+
+    (isIE9) && (method === 'PUT' || method === 'DELETE') && (function() {
+      qs['method_override'] = method;
+    })();
+
+    //append params to the path
+    var encoded_params = encodeParams(qs);
+    if (encoded_params) {
+      uri += "?" + encoded_params;
+    }
+    //stringify the body object
+    body = options.formData ? null : JSON.stringify(body);
+    //so far so good, so run the query
+    //*** ie9 hack
+    var xhr;
+    //check to see if ie9 - if so, convert delete and put calls to a POST
+    if (isIE9) { //XDomainRequest
+      xhr = new XDomainRequest();
+      (method === 'PUT' || method === 'DELETE') && (function() {
+        method = 'POST';
+      })();
+      xhr.open(method, uri);
+    } else {
+      xhr = new XMLHttpRequest();
+      xhr.open(method, uri, true);
+      //add content type = json if there is a json payload
+      if (!options.formData) {
+        xhr.setRequestHeader("Content-Type", "application/json");
+        xhr.setRequestHeader("Accept", "application/json");
+      }
     }
-    if (!xhr.isIE9 && xhr.status != 200) {
-      //there was an api error
-      var error = response.error;
-      var error_description = response.error_description;
+    xhr.isIE9 = isIE9;
+    // Handle response.
+    xhr.onerror = function(response) {
+      self._end = new Date().getTime();
       if (self.logging) {
-        console.log("Error (" + xhr.status + ")(" + error + "): " + error_description);
+        console.log("success (time: " + self.calcTimeDiff() + "): " + method +
+          " " + uri);
       }
-      if (error == "auth_expired_session_token" || error == "auth_missing_credentials" || error == "auth_unverified_oath" || error == "expired_token" || error == "unauthorized" || error == "auth_invalid") {
-        //these errors mean the user is not authorized for whatever reason. If a logout function is defined, call it
-        //if the user has specified a logout callback:
-        if (typeof self.logoutCallback === "function") {
-          return self.logoutCallback(true, response);
-        }
+      if (self.logging) {
+        console.log("Error: API call failed at the network level.");
       }
+      //network error
+      clearTimeout(timeout);
+      var err = true;
       if (typeof callback === "function") {
-        callback(true, response);
+        callback(err, response);
       }
-    } else {
-      if (typeof callback === "function") {
-        callback(false, response);
+    };
+    xhr.onload = function(response) {
+      //call timing, get time, then log the call
+      self._end = new Date().getTime();
+      if (self.logging) {
+        console.log("success (time: " + self.calcTimeDiff() + "): " + method +
+          " " + uri);
+      }
+      //call completed
+      clearTimeout(timeout);
+      //decode the response
+      try {
+        response = JSON.parse(xhr.responseText);
+      } catch (e) {
+        response = {
+          error: "unhandled_error",
+          error_description: xhr.responseText
+        };
+        xhr.status = xhr.status === 200 ? 400 : xhr.status;
+        console.error(e);
+      }
+      if (!xhr.isIE9 && xhr.status != 200) {
+        //there was an api error
+        var error = response.error;
+        var error_description = response.error_description;
+        if (self.logging) {
+          console.log("Error (" + xhr.status + ")(" + error + "): " +
+            error_description);
+        }
+        if (error == "auth_expired_session_token" || error ==
+          "auth_missing_credentials" || error == "auth_unverified_oath" ||
+          error == "expired_token" || error == "unauthorized" || error ==
+          "auth_invalid") {
+          //these errors mean the user is not authorized for whatever reason. If a logout function is defined, call it
+          //if the user has specified a logout callback:
+          if (typeof self.logoutCallback === "function") {
+            return self.logoutCallback(true, response);
+          }
+        }
+        if (typeof callback === "function") {
+          callback(true, response);
+        }
+      } else {
+        if (typeof callback === "function") {
+          callback(false, response);
+        }
+      }
+    };
+    var timeout = setTimeout(function() {
+      xhr.abort();
+      if (self._callTimeoutCallback === "function") {
+        self._callTimeoutCallback("API CALL TIMEOUT");
+      } else {
+        callback("API CALL TIMEOUT");
       }
+    }, self._callTimeout);
+    //set for 30 seconds
+    if (this.logging) {
+      console.log("calling: " + method + " " + uri);
+    }
+    if (this.buildCurl) {
+      var curlOptions = {
+        uri: uri,
+        body: body,
+        method: method
+      };
+      this.buildCurlCall(curlOptions);
     }
+    this._start = new Date().getTime();
+    xhr.send(options.formData || body);
   };
-  var timeout = setTimeout(function() {
-    xhr.abort();
-    if (self._callTimeoutCallback === "function") {
-      self._callTimeoutCallback("API CALL TIMEOUT");
-    } else {
-      callback("API CALL TIMEOUT");
-    }
-  }, self._callTimeout);
-  //set for 30 seconds
-  if (this.logging) {
-    console.log("calling: " + method + " " + uri);
-  }
-  if (this.buildCurl) {
-    var curlOptions = {
-      uri: uri,
-      body: body,
-      method: method
-    };
-    this.buildCurlCall(curlOptions);
-  }
-  this._start = new Date().getTime();
-  xhr.send(options.formData || body);
-};
 
-Usergrid.Client.prototype.keys = function(o) {
-  var a = [];
-  for (var propertyName in o) {
-    a.push(propertyName);
+  Usergrid.Client.prototype.keys = function(o) {
+    var a = [];
+    for (var propertyName in o) {
+      a.push(propertyName);
+    }
+    return a;
   }
-  return a;
-}
-
-/*
- *  Main function for creating new groups. Call this directly.
- *
- *  @method createGroup
- *  @public
- *  @params {string} path
- *  @param {function} callback
- *  @return {callback} callback(err, data)
- */
-Usergrid.Client.prototype.createGroup = function(options, callback) {
-  var getOnExist = options.getOnExist || false;
 
-  var options = {
-    path: options.path,
-    client: this,
-    data:options 
-  }
+  /*
+   *  Main function for creating new groups. Call this directly.
+   *
+   *  @method createGroup
+   *  @public
+   *  @params {string} path
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.createGroup = function(options, callback) {
+    var getOnExist = options.getOnExist || false;
 
-  var group = new Usergrid.Group(options);
-  group.fetch(function(err, data){
-    var okToSave = (err && ('service_resource_not_found' === data.error || 'no_name_specified' === data.error || 'null_pointer' === data.error || Usergrid.browser.isIE9)) || (!err && getOnExist);
-    if (okToSave) {
-      group.save(function(err, data){
+    var options = {
+      path: options.path,
+      client: this,
+      data: options
+    }
+
+    var group = new Usergrid.Group(options);
+    group.fetch(function(err, data) {
+      var okToSave = (err && ('service_resource_not_found' === data.error ||
+        'no_name_specified' === data.error || 'null_pointer' === data.error ||
+        Usergrid.browser.isIE9)) || (!err && getOnExist);
+      if (okToSave) {
+        group.save(function(err, data) {
+          if (typeof(callback) === 'function') {
+            callback(err, group);
+          }
+        });
+      } else {
         if (typeof(callback) === 'function') {
           callback(err, group);
         }
-      });
-    } else {
-      if(typeof(callback) === 'function') {
-        callback(err, group);
       }
-    }
-  });
-}
+    });
+  }
 
-/*
-*  Main function for creating new entities - should be called directly.
-*
-*  options object: options {data:{'type':'collection_type', 'key':'value'}, uuid:uuid}}
-*
-*  @method createEntity
-*  @public
-*  @params {object} options
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*/
-Usergrid.Client.prototype.createEntity = function (options, callback) {
-  // todo: replace the check for new / save on not found code with simple save
-  // when users PUT on no user fix is in place.
   /*
+   *  Main function for creating new entities - should be called directly.
+   *
+   *  options object: options {data:{'type':'collection_type', 'key':'value'}, uuid:uuid}}
+   *
+   *  @method createEntity
+   *  @public
+   *  @params {object} options
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.createEntity = function(options, callback) {
+    // todo: replace the check for new / save on not found code with simple save
+    // when users PUT on no user fix is in place.
+    /*
   var options = {
     client:this,
     data:options
@@ -284,150 +299,152 @@ Usergrid.Client.prototype.createEntity = function (options, callback) {
     }
   });
   */
-  var getOnExist = options.getOnExist || false; //if true, will return entity if one already exists
-  var options = {
-    client:this,
-    data:options
-  }
-  var entity = new Usergrid.Entity(options);
-  entity.fetch(function(err, data) {
-    //if the fetch doesn't find what we are looking for, or there is no error, do a save
-    if (Usergrid.browser.isIE9 || 'service_resource_not_found' === data.error || 'no_name_specified' === data.error || 'null_pointer' === data.error) {
-
-      entity.set(options.data); //add the data again just in case
-      entity.save(function(err, data) {
-        if (typeof(callback) === 'function') {
-          callback(err, entity, data);
-        }
-      });
+    var getOnExist = options.getOnExist || false; //if true, will return entity if one already exists
+    var options = {
+      client: this,
+      data: options
+    }
+    var entity = new Usergrid.Entity(options);
+    entity.fetch(function(err, data) {
+      //if the fetch doesn't find what we are looking for, or there is no error, do a save
+      if (Usergrid.browser.isIE9 || 'service_resource_not_found' === data.error ||
+        'no_name_specified' === data.error || 'null_pointer' === data.error
+      ) {
+
+        entity.set(options.data); //add the data again just in case
+        entity.save(function(err, data) {
+          if (typeof(callback) === 'function') {
+            callback(err, entity, data);
+          }
+        });
 
-    } else {
-      if (getOnExist) {
-        // entity exists and they want it returned
-        if (typeof(callback) === 'function') {
-          callback(err, entity, data);
-        }
       } else {
-        //entity exists but they want an error to that effect
-        err = true;
-        callback(err, 'duplicate entity already exists');
+        if (getOnExist) {
+          // entity exists and they want it returned
+          if (typeof(callback) === 'function') {
+            callback(err, entity, data);
+          }
+        } else {
+          //entity exists but they want an error to that effect
+          err = true;
+          callback(err, 'duplicate entity already exists');
+        }
       }
-    }
 
-  });
-
-}
+    });
 
-/*
- *  Main function for getting existing entities - should be called directly.
- *
- *  You must supply a uuid or (username or name). Username only applies to users.
- *  Name applies to all custom entities
- *
- *  options object: options {data:{'type':'collection_type', 'name':'value', 'username':'value'}, uuid:uuid}}
- *
- *  @method createEntity
- *  @public
- *  @params {object} options
- *  @param {function} callback
- *  @return {callback} callback(err, data)
- */
-Usergrid.Client.prototype.getEntity = function (options, callback) {
-  var options = {
-    client:this,
-    data:options
   }
-  var entity = new Usergrid.Entity(options);
-  entity.fetch(function(err, data) {
-    if (typeof(callback) === 'function') {
-      callback(err, entity, data);
+
+  /*
+   *  Main function for getting existing entities - should be called directly.
+   *
+   *  You must supply a uuid or (username or name). Username only applies to users.
+   *  Name applies to all custom entities
+   *
+   *  options object: options {data:{'type':'collection_type', 'name':'value', 'username':'value'}, uuid:uuid}}
+   *
+   *  @method createEntity
+   *  @public
+   *  @params {object} options
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.getEntity = function(options, callback) {
+    var options = {
+      client: this,
+      data: options
     }
-  });
-}
-/*
- *  Main function for restoring an entity from serialized data.
- *
- *  serializedObject should have come from entityObject.serialize();
- *
- *  @method restoreEntity
- *  @public
- *  @param {string} serializedObject
- *  @return {object} Entity Object
- */
-Usergrid.Client.prototype.restoreEntity = function (serializedObject) {
-  var data = JSON.parse(serializedObject);
-  var options = {
-    client:this,
-    data:data
+    var entity = new Usergrid.Entity(options);
+    entity.fetch(function(err, data) {
+      if (typeof(callback) === 'function') {
+        callback(err, entity, data);
+      }
+    });
   }
-  var entity = new Usergrid.Entity(options);
-  return entity;
-}
-
-/*
-*  Main function for creating new collections - should be called directly.
-*
-*  options object: options {client:client, type: type, qs:qs}
-*
-*  @method createCollection
-*  @public
-*  @params {object} options
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*/
-Usergrid.Client.prototype.createCollection = function (options, callback) {
-  options.client = this;
-  var collection = new Usergrid.Collection(options, function(err, data) {
-    if (typeof(callback) === 'function') {
-      callback(err, collection, data);
+  /*
+   *  Main function for restoring an entity from serialized data.
+   *
+   *  serializedObject should have come from entityObject.serialize();
+   *
+   *  @method restoreEntity
+   *  @public
+   *  @param {string} serializedObject
+   *  @return {object} Entity Object
+   */
+  Usergrid.Client.prototype.restoreEntity = function(serializedObject) {
+    var data = JSON.parse(serializedObject);
+    var options = {
+      client: this,
+      data: data
     }
-  });
-}
+    var entity = new Usergrid.Entity(options);
+    return entity;
+  }
 
-/*
- *  Main function for restoring a collection from serialized data.
- *
- *  serializedObject should have come from collectionObject.serialize();
- *
- *  @method restoreCollection
- *  @public
- *  @param {string} serializedObject
- *  @return {object} Collection Object
- */
-Usergrid.Client.prototype.restoreCollection = function (serializedObject) {
-  var data = JSON.parse(serializedObject);
-  data.client = this;
-  var collection = new Usergrid.Collection(data);
-  return collection;
-}
+  /*
+   *  Main function for creating new collections - should be called directly.
+   *
+   *  options object: options {client:client, type: type, qs:qs}
+   *
+   *  @method createCollection
+   *  @public
+   *  @params {object} options
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.createCollection = function(options, callback) {
+    options.client = this;
+    var collection = new Usergrid.Collection(options, function(err, data) {
+      if (typeof(callback) === 'function') {
+        callback(err, collection, data);
+      }
+    });
+  }
 
-/*
- *  Main function for retrieving a user's activity feed.
- *
- *  @method getFeedForUser
- *  @public
- *  @params {string} username
- *  @param {function} callback
- *  @return {callback} callback(err, data, activities)
- */
-Usergrid.Client.prototype.getFeedForUser = function(username, callback) {
-  var options = {
-    method: "GET",
-    endpoint: "users/"+username+"/feed"
+  /*
+   *  Main function for restoring a collection from serialized data.
+   *
+   *  serializedObject should have come from collectionObject.serialize();
+   *
+   *  @method restoreCollection
+   *  @public
+   *  @param {string} serializedObject
+   *  @return {object} Collection Object
+   */
+  Usergrid.Client.prototype.restoreCollection = function(serializedObject) {
+    var data = JSON.parse(serializedObject);
+    data.client = this;
+    var collection = new Usergrid.Collection(data);
+    return collection;
   }
 
-  this.request(options, function(err, data){
-    if(typeof(callback) === "function") {
-      if(err) {
-        callback(err);
-      } else {
-        callback(err, data, data.entities);
-      }
+  /*
+   *  Main function for retrieving a user's activity feed.
+   *
+   *  @method getFeedForUser
+   *  @public
+   *  @params {string} username
+   *  @param {function} callback
+   *  @return {callback} callback(err, data, activities)
+   */
+  Usergrid.Client.prototype.getFeedForUser = function(username, callback) {
+    var options = {
+      method: "GET",
+      endpoint: "users/" + username + "/feed"
     }
-  });
-}
 
-/*
+    this.request(options, function(err, data) {
+      if (typeof(callback) === "function") {
+        if (err) {
+          callback(err);
+        } else {
+          callback(err, data, data.entities);
+        }
+      }
+    });
+  }
+
+  /*
 *  Function for creating new activities for the current user - should be called directly.
 *
 *  //user can be any of the following: "me", a uuid, a username
@@ -463,388 +480,408 @@ Usergrid.Client.prototype.getFeedForUser = function(username, callback) {
 *  @param {function} callback
 *  @return {callback} callback(err, data)
 */
-Usergrid.Client.prototype.createUserActivity = function (user, options, callback) {
-  options.type = 'users/'+user+'/activities';
-  var options = {
-    client:this,
-    data:options
-  }
-  var entity = new Usergrid.Entity(options);
-  entity.save(function(err, data) {
-    if (typeof(callback) === 'function') {
-      callback(err, entity);
+  Usergrid.Client.prototype.createUserActivity = function(user, options,
+    callback) {
+    options.type = 'users/' + user + '/activities';
+    var options = {
+      client: this,
+      data: options
     }
-  });
-}
+    var entity = new Usergrid.Entity(options);
+    entity.save(function(err, data) {
+      if (typeof(callback) === 'function') {
+        callback(err, entity);
+      }
+    });
+  }
 
-/*
- *  Function for creating user activities with an associated user entity.
- *
- *  user object:
- *  The user object passed into this function is an instance of Usergrid.Entity.
- *
- *  @method createUserActivityWithEntity
- *  @public
- *  @params {object} user
- *  @params {string} content
- *  @param {function} callback
- *  @return {callback} callback(err, data)
- */
-Usergrid.Client.prototype.createUserActivityWithEntity = function(user, content, callback) {
-  var username = user.get("username");
-  var options = {
-    actor: {
-      "displayName":username,
-      "uuid":user.get("uuid"),
-      "username":username,
-      "email":user.get("email"),
-      "picture":user.get("picture"),
-      "image": {
-        "duration":0,
-        "height":80,
-        "url":user.get("picture"),
-        "width":80
-       },
-    },
-    "verb":"post",
-    "content":content };
+  /*
+   *  Function for creating user activities with an associated user entity.
+   *
+   *  user object:
+   *  The user object passed into this function is an instance of Usergrid.Entity.
+   *
+   *  @method createUserActivityWithEntity
+   *  @public
+   *  @params {object} user
+   *  @params {string} content
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.createUserActivityWithEntity = function(user,
+    content, callback) {
+    var username = user.get("username");
+    var options = {
+      actor: {
+        "displayName": username,
+        "uuid": user.get("uuid"),
+        "username": username,
+        "email": user.get("email"),
+        "picture": user.get("picture"),
+        "image": {
+          "duration": 0,
+          "height": 80,
+          "url": user.get("picture"),
+          "width": 80
+        },
+      },
+      "verb": "post",
+      "content": content
+    };
 
     this.createUserActivity(username, options, callback);
 
-}
-
-/*
-*  A private method to get call timing of last call
-*/
-Usergrid.Client.prototype.calcTimeDiff = function () {
- var seconds = 0;
- var time = this._end - this._start;
- try {
-    seconds = ((time/10) / 60).toFixed(2);
- } catch(e) { return 0; }
- return seconds;
-}
+  }
 
-/*
- *  A public method to store the OAuth token for later use - uses localstorage if available
- *
- *  @method setToken
- *  @public
- *  @params {string} token
- *  @return none
- */
-Usergrid.Client.prototype.setToken = function (token) {
-  this.set('token', token);
-}
+  /*
+   *  A private method to get call timing of last call
+   */
+  Usergrid.Client.prototype.calcTimeDiff = function() {
+    var seconds = 0;
+    var time = this._end - this._start;
+    try {
+      seconds = ((time / 10) / 60).toFixed(2);
+    } catch (e) {
+      return 0;
+    }
+    return seconds;
+  }
 
-/*
- *  A public method to get the OAuth token
- *
- *  @method getToken
- *  @public
- *  @return {string} token
- */
-Usergrid.Client.prototype.getToken = function () {
-  return this.get('token');
-}
+  /*
+   *  A public method to store the OAuth token for later use - uses localstorage if available
+   *
+   *  @method setToken
+   *  @public
+   *  @params {string} token
+   *  @return none
+   */
+  Usergrid.Client.prototype.setToken = function(token) {
+    this.set('token', token);
+  }
 
-Usergrid.Client.prototype.setObject = function(key, value) {
-  if (value) {
-    value = JSON.stringify(value);
+  /*
+   *  A public method to get the OAuth token
+   *
+   *  @method getToken
+   *  @public
+   *  @return {string} token
+   */
+  Usergrid.Client.prototype.getToken = function() {
+    return this.get('token');
   }
-  this.set(key, value);
-}
 
-Usergrid.Client.prototype.set = function (key, value) {
-  var keyStore =  'apigee_' + key;
-  this[key] = value;
-  if(typeof(Storage)!=="undefined"){
+  Usergrid.Client.prototype.setObject = function(key, value) {
     if (value) {
-      localStorage.setItem(keyStore, value);
-    } else {
-      localStorage.removeItem(keyStore);
+      value = JSON.stringify(value);
     }
+    this.set(key, value);
   }
-}
-
-Usergrid.Client.prototype.getObject = function(key) {
-  return JSON.parse(this.get(key));
-}
 
-Usergrid.Client.prototype.get = function (key) {
-  var keyStore = 'apigee_' + key;
-  if (this[key]) {
-    return this[key];
-  } else if(typeof(Storage)!=="undefined") {
-    return localStorage.getItem(keyStore);
+  Usergrid.Client.prototype.set = function(key, value) {
+    var keyStore = 'apigee_' + key;
+    this[key] = value;
+    if (typeof(Storage) !== "undefined") {
+      if (value) {
+        localStorage.setItem(keyStore, value);
+      } else {
+        localStorage.removeItem(keyStore);
+      }
+    }
   }
-  return null;
-}
 
-/*
- * A public facing helper method for signing up users
- *
- * @method signup
- * @public
- * @params {string} username
- * @params {string} password
- * @params {string} email
- * @params {string} name
- * @param {function} callback
- * @return {callback} callback(err, data)
- */
-Usergrid.Client.prototype.signup = function(username, password, email, name, callback) {
-  var self = this;
-  var options = {
-    type:"users",
-    username:username,
-    password:password,
-    email:email,
-    name:name
-  };
+  Usergrid.Client.prototype.getObject = function(key) {
+    return JSON.parse(this.get(key));
+  }
 
-  this.createEntity(options, callback);
-}
+  Usergrid.Client.prototype.get = function(key) {
+    var keyStore = 'apigee_' + key;
+    if (this[key]) {
+      return this[key];
+    } else if (typeof(Storage) !== "undefined") {
+      return localStorage.getItem(keyStore);
+    }
+    return null;
+  }
 
-/*
-*
-*  A public method to log in an app user - stores the token for later use
-*
-*  @method login
-*  @public
-*  @params {string} username
-*  @params {string} password
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*/
-Usergrid.Client.prototype.login = function (username, password, callback) {
-  var self = this;
-  var options = {
-    method:'POST',
-    endpoint:'token',
-    body:{
+  /*
+   * A public facing helper method for signing up users
+   *
+   * @method signup
+   * @public
+   * @params {string} username
+   * @params {string} password
+   * @params {string} email
+   * @params {string} name
+   * @param {function} callback
+   * @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.signup = function(username, password, email, name,
+    callback) {
+    var self = this;
+    var options = {
+      type: "users",
       username: username,
       password: password,
-      grant_type: 'password'
-    }
-  };
-  this.request(options, function(err, data) {
-    var user = {};
-    if (err && self.logging) {
-      console.log('error trying to log user in');
-    } else {
-      var options = {
-        client:self,
-        data:data.user
-      }
-      user = new Usergrid.Entity(options);
-      self.setToken(data.access_token);
-    }
-    if (typeof(callback) === 'function') {
-      callback(err, data, user);
-    }
-  });
-}
-
-
-Usergrid.Client.prototype.reAuthenticateLite = function (callback) {
-  var self = this;
-  var options = {
-    method:'GET',
-    endpoint:'management/me',
-    mQuery:true
-  };
-  this.request(options, function(err, response) {
-    if (err && self.logging) {
-      console.log('error trying to re-authenticate user');
-    } else {
-
-      //save the re-authed token and current email/username
-      self.setToken(response.access_token);
+      email: email,
+      name: name
+    };
 
-    }
-    if (typeof(callback) === 'function') {
-      callback(err);
-    }
-  });
-}
+    this.createEntity(options, callback);
+  }
 
+  /*
+   *
+   *  A public method to log in an app user - stores the token for later use
+   *
+   *  @method login
+   *  @public
+   *  @params {string} username
+   *  @params {string} password
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.login = function(username, password, callback) {
+    var self = this;
+    var options = {
+      method: 'POST',
+      endpoint: 'token',
+      body: {
+        username: username,
+        password: password,
+        grant_type: 'password'
+      }
+    };
+    this.request(options, function(err, data) {
+      var user = {};
+      if (err && self.logging) {
+        console.log('error trying to log user in');
+      } else {
+        var options = {
+          client: self,
+          data: data.user
+        }
+        user = new Usergrid.Entity(options);
+        self.setToken(data.access_token);
+      }
+      if (typeof(callback) === 'function') {
+        callback(err, data, user);
+      }
+    });
+  }
 
-Usergrid.Client.prototype.reAuthenticate = function (email, callback) {
-  var self = this;
-  var options = {
-    method:'GET',
-    endpoint:'management/users/'+email,
-    mQuery:true
-  };
-  this.request(options, function(err, response) {
-    var organizations = {};
-    var applications = {};
-    var user = {};
-    if (err && self.logging) {
-      console.log('error trying to full authenticate user');
-    } else {
-      var data = response.data;
-      self.setToken(data.token);
-      self.set('email', data.email);
 
-      //delete next block and corresponding function when iframes are refactored
-      localStorage.setItem('accessToken', data.token);
-      localStorage.setItem('userUUID', data.uuid);
-      localStorage.setItem('userEmail', data.email);
-      //end delete block
+  Usergrid.Client.prototype.reAuthenticateLite = function(callback) {
+    var self = this;
+    var options = {
+      method: 'GET',
+      endpoint: 'management/me',
+      mQuery: true
+    };
+    this.request(options, function(err, response) {
+      if (err && self.logging) {
+        console.log('error trying to re-authenticate user');
+      } else {
 
+        //save the re-authed token and current email/username
+        self.setToken(response.access_token);
 
-      var userData = {
-        "username" : data.username,
-        "email" : data.email,
-        "name" : data.name,
-        "uuid" : data.uuid
       }
-      var options = {
-        client:self,
-        data:userData
+      if (typeof(callback) === 'function') {
+        callback(err);
       }
-      user = new Usergrid.Entity(options);
+    });
+  }
 
-      organizations = data.organizations;
-      var org = '';
-      try {
-        //if we have an org stored, then use that one. Otherwise, use the first one.
-        var existingOrg = self.get('orgName');
-        org = (organizations[existingOrg])?organizations[existingOrg]:organizations[Object.keys(organizations)[0]];
-        self.set('orgName', org.name);
-      } catch(e) {
-        err = true;
-        if (self.logging) { console.log('error selecting org'); }
-      } //should always be an org
-
-      applications = self.parseApplicationsArray(org);
-      self.selectFirstApp(applications);
 
-      self.setObject('organizations', organizations);
-      self.setObject('applications', applications);
+  Usergrid.Client.prototype.reAuthenticate = function(email, callback) {
+    var self = this;
+    var options = {
+      method: 'GET',
+      endpoint: 'management/users/' + email,
+      mQuery: true
+    };
+    this.request(options, function(err, response) {
+      var organizations = {};
+      var applications = {};
+      var user = {};
+      if (err && self.logging) {
+        console.log('error trying to full authenticate user');
+      } else {
+        var data = response.data;
+        self.setToken(data.token);
+        self.set('email', data.email);
+
+        //delete next block and corresponding function when iframes are refactored
+        localStorage.setItem('accessToken', data.token);
+        localStorage.setItem('userUUID', data.uuid);
+        localStorage.setItem('userEmail', data.email);
+        //end delete block
+
+
+        var userData = {
+          "username": data.username,
+          "email": data.email,
+          "name": data.name,
+          "uuid": data.uuid
+        }
+        var options = {
+          client: self,
+          data: userData
+        }
+        user = new Usergrid.Entity(options);
+
+        organizations = data.organizations;
+        var org = '';
+        try {
+          //if we have an org stored, then use that one. Otherwise, use the first one.
+          var existingOrg = self.get('orgName');
+          org = (organizations[existingOrg]) ? organizations[existingOrg] :
+            organizations[Object.keys(organizations)[0]];
+          self.set('orgName', org.name);
+        } catch (e) {
+          err = true;
+          if (self.logging) {
+            console.log('error selecting org');
+          }
+        } //should always be an org
 
-    }
-    if (typeof(callback) === 'function') {
-      callback(err, data, user, organizations, applications);
-    }
-  });
-}
+        applications = self.parseApplicationsArray(org);
+        self.selectFirstApp(applications);
+
+        self.setObject('organizations', organizations);
+        self.setObject('applications', applications);
 
-Usergrid.Client.prototype.orgLogin = function (username, password, callback) {
-  var self = this;
-  var options = {
-    method:'POST',
-    endpoint:'management/token',
-    mQuery:true,
-    body:{
-      username: username,
-      password: password,
-      grant_type: 'password'
-    }
-  };
-  this.request(options, function(err, data) {
-    var user = {};
-    var organizations = {};
-    var applications = {};
-    if (err && self.logging) {
-      console.log('error trying to log user in');
-    } else {
-      var options = {
-        client:self,
-        data:data.user
       }
-      user = new Usergrid.Entity(options);
-      self.setToken(data.access_token);
-      self.set('email', data.user.email);
+      if (typeof(callback) === 'function') {
+        callback(err, data, user, organizations, applications);
+      }
+    });
+  }
 
+  Usergrid.Client.prototype.orgLogin = function(username, password, callback) {
+    var self = this;
+    var options = {
+      method: 'POST',
+      endpoint: 'management/token',
+      mQuery: true,
+      body: {
+        username: username,
+        password: password,
+        grant_type: 'password'
+      }
+    };
+    this.request(options, function(err, data) {
+      var user = {};
+      var organizations = {};
+      var applications = {};
+      if (err && self.logging) {
+        console.log('error trying to log user in');
+      } else {
+        var options = {
+          client: self,
+          data: data.user
+        }
+        user = new Usergrid.Entity(options);
+        self.setToken(data.access_token);
+        self.set('email', data.user.email);
+
+
+        //delete next block and corresponding function when iframes are refactored
+        localStorage.setItem('accessToken', data.access_token);
+        localStorage.setItem('userUUID', data.user.uuid);
+        localStorage.setItem('userEmail', data.user.email);
+        //end delete block
+
+
+        organizations = data.user.organizations;
+        var org = '';
+        try {
+          //if we have an org stored, then use that one. Otherwise, use the first one.
+          var existingOrg = self.get('orgName');
+          org = (organizations[existingOrg]) ? organizations[existingOrg] :
+            organizations[Object.keys(organizations)[0]];
+          self.set('orgName', org.name);
+        } catch (e) {
+          err = true;
+          if (self.logging) {
+            console.log('error selecting org');
+          }
+        } //should always be an org
 
-      //delete next block and corresponding function when iframes are refactored
-      localStorage.setItem('accessToken', data.access_token);
-      localStorage.setItem('userUUID', data.user.uuid);
-      localStorage.setItem('userEmail', data.user.email);
-      //end delete block
+        applications = self.parseApplicationsArray(org);
+        self.selectFirstApp(applications);
 
+        self.setObject('organizations', organizations);
+        self.setObject('applications', applications);
 
-      organizations = data.user.organizations;
-      var org = '';
-      try {
-        //if we have an org stored, then use that one. Otherwise, use the first one.
-        var existingOrg = self.get('orgName');
-        org = (organizations[existingOrg])?organizations[existingOrg]:organizations[Object.keys(organizations)[0]];
-        self.set('orgName', org.name);
-      } catch(e) {
-        err = true;
-        if (self.logging) { console.log('error selecting org'); }
-      } //should always be an org
-
-      applications = self.parseApplicationsArray(org);
-      self.selectFirstApp(applications);
+      }
+      if (typeof(callback) === 'function') {
+        callback(err, data, user, organizations, applications);
+      }
+    });
+  }
 
-      self.setObject('organizations', organizations);
-      self.setObject('applications', applications);
+  Usergrid.Client.prototype.parseApplicationsArray = function(org) {
+    var applications = {};
 
+    for (var key in org.applications) {
+      var uuid = org.applications[key];
+      var name = key.split("/")[1];
+      applications[name] = ({
+        uuid: uuid,
+        name: name
+      });
     }
-    if (typeof(callback) === 'function') {
-      callback(err, data, user, organizations, applications);
-    }
-  });
-}
-
-Usergrid.Client.prototype.parseApplicationsArray = function (org) {
-  var applications = {};
 
-  for (var key in org.applications) {
-    var uuid = org.applications[key];
-    var name = key.split("/")[1];
-    applications[name] = ({uuid:uuid, name:name});
+    return applications;
   }
 
-  return applications;
-}
-
-Usergrid.Client.prototype.selectFirstApp = function (applications) {
-  try {
-    //try to select an app if one exists (will use existing if possible)
-    var existingApp = this.get('appName');
-    var firstApp = Object.keys(applications)[0];
-    var appName = (applications[existingApp])?existingApp:Object.keys(applications)[0];
-    this.set('appName', appName);
-  } catch(e){}//may or may not be an application, if no, just fall through
-  return appName;
-}
+  Usergrid.Client.prototype.selectFirstApp = function(applications) {
+    try {
+      //try to select an app if one exists (will use existing if possible)
+      var existingApp = this.get('appName');
+      var firstApp = Object.keys(applications)[0];
+      var appName = (applications[existingApp]) ? existingApp : Object.keys(
+        applications)[0];
+      this.set('appName', appName);
+    } catch (e) {} //may or may not be an application, if no, just fall through
+    return appName;
+  }
 
-Usergrid.Client.prototype.createApplication = function (name, callback) {
-  var self = this;
-  var options = {
-    method:'POST',
-    endpoint:'management/organizations/'+ this.get('orgName') + '/applications',
-    mQuery:true,
-    body:{name:name}
-  };
-  this.request(options, function(err, response) {
-    var applications = {};
-    if (err && self.logging) {
-      console.log('error trying to create new application');
-      if (typeof(callback) === 'function') {
-        callback(err, applications);
+  Usergrid.Client.prototype.createApplication = function(name, callback) {
+    var self = this;
+    var options = {
+      method: 'POST',
+      endpoint: 'management/organizations/' + this.get('orgName') +
+        '/applications',
+      mQuery: true,
+      body: {
+        name: name
       }
-    } else {
-      self.getApplications(callback);
-    }
-  });
-}
+    };
+    this.request(options, function(err, response) {
+      var applications = {};
+      if (err && self.logging) {
+        console.log('error trying to create new application');
+        if (typeof(callback) === 'function') {
+          callback(err, applications);
+        }
+      } else {
+        self.getApplications(callback);
+      }
+    });
+  }
 
-Usergrid.Client.prototype.getApplications = function(callback) {
-  var self = this;
-  var options = {
-    method:'GET',
-    endpoint:'management/organizations/'+this.get('orgName')+'/applications',
-    mQuery:true
-  };
-  this.request(options, function(err, data) {
-/*
+  Usergrid.Client.prototype.getApplications = function(callback) {
+    var self = this;
+    var options = {
+      method: 'GET',
+      endpoint: 'management/organizations/' + this.get('orgName') +
+        '/applications',
+      mQuery: true
+    };
+    this.request(options, function(err, data) {
+      /*
     //grab the applications
     var applicationsData = data.data;
     var applicationNames = self.keys(applicationsData).sort();
@@ -862,1571 +899,1609 @@ Usergrid.Client.prototype.getApplications = function(callback) {
       count++;
     } */
 
-    applications = self.parseApplicationsArray({applications:data.data});
-    self.selectFirstApp(applications);
-    self.setObject('applications',applications);
-
-    if(typeof(callback) === 'function') {
-      callback(err, applications);
-    }
-  });
-}
-
-Usergrid.Client.prototype.getAdministrators = function (callback) {
-  var self = this;
-  var options = {
-    method:'GET',
-    endpoint:'management/organizations/'+this.get('orgName')+'/users',
-    mQuery:true
-  };
-  this.request(options, function (err, data) {
-    var administrators = [];
-    if (err) {
+      applications = self.parseApplicationsArray({
+        applications: data.data
+      });
+      self.selectFirstApp(applications);
+      self.setObject('applications', applications);
 
-    } else {
-      var administrators = [];
-      for(var i in data.data) {
-        var admin = data.data[i];
-        admin.image = self.getDisplayImage(admin.email, admin.picture);
-        administrators.push(admin);
+      if (typeof(callback) === 'function') {
+        callback(err, applications);
       }
-    }
+    });
+  }
 
-    if (typeof(callback) === 'function') {
-      callback(err, administrators);
-    }
-  });
-}
+  Usergrid.Client.prototype.getAdministrators = function(callback) {
+    var self = this;
+    var options = {
+      method: 'GET',
+      endpoint: 'management/organizations/' + this.get('orgName') +
+        '/users',
+      mQuery: true
+    };
+    this.request(options, function(err, data) {
+      var administrators = [];
+      if (err) {
 
+      } else {
+        var administrators = [];
+        for (var i in data.data) {
+          var admin = data.data[i];
+          admin.image = self.getDisplayImage(admin.email, admin.picture);
+          administrators.push(admin);
+        }
+      }
 
-Usergrid.Client.prototype.createAdministrator = function (email, callback) {
-  var self = this;
-  var options = {
-    method:'POST',
-    endpoint:'management/organizations/'+ this.get('orgName') + '/users',
-    mQuery:true,
-    body:{email:email, password:''}
-  };
-  this.request(options, function(err, response) {
-    var admins = {};
-    if (err && self.logging) {
-      console.log('error trying to create new administrator');
       if (typeof(callback) === 'function') {
-        callback(err, admins);
+        callback(err, administrators);
       }
-    } else {
-      self.getAdministrators(callback);
-    }
-  });
-}
-
-
+    });
+  }
 
 
+  Usergrid.Client.prototype.createAdministrator = function(email, callback) {
+    var self = this;
+    var options = {
+      method: 'POST',
+      endpoint: 'management/organizations/' + this.get('orgName') +
+        '/users',
+      mQuery: true,
+      body: {
+        email: email,
+        password: ''
+      }
+    };
+    this.request(options, function(err, response) {
+      var admins = {};
+      if (err && self.logging) {
+        console.log('error trying to create new administrator');
+        if (typeof(callback) === 'function') {
+          callback(err, admins);
+        }
+      } else {
+        self.getAdministrators(callback);
+      }
+    });
+  }
 
 
-/*
-*  A public method to log in an app user with facebook - stores the token for later use
-*
-*  @method loginFacebook
-*  @public
-*  @params {string} username
-*  @params {string} password
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*/
-Usergrid.Client.prototype.loginFacebook = function (facebookToken, callback) {
-  var self = this;
-  var options = {
-    method:'GET',
-    endpoint:'auth/facebook',
-    qs:{
-      fb_access_token: facebookToken
-    }
-  };
-  this.request(options, function(err, data) {
-    var user = {};
-    if (err && self.logging) {
-      console.log('error trying to log user in');
-    } else {
-      var options = {
-        client: self,
-        data: data.user
-      }
-      user = new Usergrid.Entity(options);
-      self.setToken(data.access_token);
-    }
-    if (typeof(callback) === 'function') {
-      callback(err, data, user);
-    }
-  });
-}
 
-/*
-*  A public method to get the currently logged in user entity
-*
-*  @method getLoggedInUser
-*  @public
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*/
-Usergrid.Client.prototype.getLoggedInUser = function (callback) {
-  if (!this.getToken()) {
-    callback(true, null, null);
-  } else {
+  /*
+   *  A public method to log in an app user with facebook - stores the token for later use
+   *
+   *  @method loginFacebook
+   *  @public
+   *  @params {string} username
+   *  @params {string} password
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.loginFacebook = function(facebookToken, callback) {
     var self = this;
     var options = {
-      method:'GET',
-      endpoint:'users/me'
+      method: 'GET',
+      endpoint: 'auth/facebook',
+      qs: {
+        fb_access_token: facebookToken
+      }
     };
     this.request(options, function(err, data) {
-      if (err) {
-        if (self.logging) {
-          console.log('error trying to log user in');
-        }
-        if (typeof(callback) === 'function') {
-          callback(err, data, null);
-        }
+      var user = {};
+      if (err && self.logging) {
+        console.log('error trying to log user in');
       } else {
         var options = {
-          client:self,
-          data:data.entities[0]
-        }
-        var user = new Usergrid.Entity(options);
-        if (typeof(callback) === 'function') {
-          callback(err, data, user);
+          client: self,
+          data: data.user
         }
+        user = new Usergrid.Entity(options);
+        self.setToken(data.access_token);
+      }
+      if (typeof(callback) === 'function') {
+        callback(err, data, user);
       }
     });
   }
-}
 
-/*
-*  A public method to test if a user is logged in - does not guarantee that the token is still valid,
-*  but rather that one exists
-*
-*  @method isLoggedIn
-*  @public
-*  @return {boolean} Returns true the user is logged in (has token and uuid), false if not
-*/
-Usergrid.Client.prototype.isLoggedIn = function () {
-  if (this.getToken()) {
-    return true;
+  /*
+   *  A public method to get the currently logged in user entity
+   *
+   *  @method getLoggedInUser
+   *  @public
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Client.prototype.getLoggedInUser = function(callback) {
+    if (!this.getToken()) {
+      callback(true, null, null);
+    } else {
+      var self = this;
+      var options = {
+        method: 'GET',
+        endpoint: 'users/me'
+      };
+      this.request(options, function(err, data) {
+        if (err) {
+          if (self.logging) {
+            console.log('error trying to log user in');
+          }
+          if (typeof(callback) === 'function') {
+            callback(err, data, null);
+          }
+        } else {
+          var options = {
+            client: self,
+            data: data.entities[0]
+          }
+          var user = new Usergrid.Entity(options);
+          if (typeof(callback) === 'function') {
+            callback(err, data, user);
+          }
+        }
+      });
+    }
   }
-  return false;
-}
 
-/*
-*  A public method to log out an app user - clears all user fields from client
-*
-*  @method logout
-*  @public
-*  @return none
-*/
-Usergrid.Client.prototype.logout = function () {
-  this.setToken(null);
-  this.setObject('organizations', null);
-  this.setObject('applications', null);
-  this.set('orgName', null);
-  this.set('appName', null);
-  this.set('email', null);
-  this.set("developerkey", null);
-}
+  /*
+   *  A public method to test if a user is logged in - does not guarantee that the token is still valid,
+   *  but rather that one exists
+   *
+   *  @method isLoggedIn
+   *  @public
+   *  @return {boolean} Returns true the user is logged in (has token and uuid), false if not
+   */
+  Usergrid.Client.prototype.isLoggedIn = function() {
+    if (this.getToken()) {
+      return true;
+    }
+    return false;
+  }
 
-/*
-*  A private method to build the curl call to display on the command line
-*
-*  @method buildCurlCall
-*  @private
-*  @param {object} options
-*  @return {string} curl
-*/
-Usergrid.Client.prototype.buildCurlCall = function (options) {
-  var curl = 'curl';
-  var method = (options.method || 'GET').toUpperCase();
-  var body = options.body || {};
-  var uri = options.uri;
-
-  //curl - add the method to the command (no need to add anything for GET)
-  if (method === 'POST') {curl += ' -X POST'; }
-  else if (method === 'PUT') { curl += ' -X PUT'; }
-  else if (method === 'DELETE') { curl += ' -X DELETE'; }
-  else { curl += ' -X GET'; }
-
-  //curl - append the path
-  curl += ' ' + uri;
-
-  //curl - add the body
-  if (body !== '"{}"' && method !== 'GET' && method !== 'DELETE') {
-    //curl - add in the json obj
-    curl += " -d '" + body + "'";
-  }
-
-  //log the curl command to the console
-  console.log(curl);
-
-  return curl;
-}
-Usergrid.Client.prototype.getDisplayImage = function (email, picture, size) {
-  try {
-    if (picture) {
-      return picture;
-    }
-    var size = size || 50;
-    if (email.length) {
-      return 'https://secure.gravatar.com/avatar/' + MD5(email) + '?s=' + size;
+  /*
+   *  A public method to log out an app user - clears all user fields from client
+   *
+   *  @method logout
+   *  @public
+   *  @return none
+   */
+  Usergrid.Client.prototype.logout = function() {
+    this.setToken(null);
+    this.setObject('organizations', null);
+    this.setObject('applications', null);
+    this.set('orgName', null);
+    this.set('appName', null);
+    this.set('email', null);
+    this.set("developerkey", null);
+  }
+
+  /*
+   *  A private method to build the curl call to display on the command line
+   *
+   *  @method buildCurlCall
+   *  @private
+   *  @param {object} options
+   *  @return {string} curl
+   */
+  Usergrid.Client.prototype.buildCurlCall = function(options) {
+    var curl = 'curl';
+    var method = (options.method || 'GET').toUpperCase();
+    var body = options.body || {};
+    var uri = options.uri;
+
+    //curl - add the method to the command (no need to add anything for GET)
+    if (method === 'POST') {
+      curl += ' -X POST';
+    } else if (method === 'PUT') {
+      curl += ' -X PUT';
+    } else if (method === 'DELETE') {
+      curl += ' -X DELETE';
     } else {
-      return 'https://apigee.com/usergrid/img/user_profile.png';
+      curl += ' -X GET';
     }
-  } catch(e) {
-    return 'https://apigee.com/usergrid/img/user_profile.png';
-  }
-}
 
-/*
-*  A class to Model a Usergrid Entity.
-*  Set the type of entity in the 'data' json object
-*
-*  @constructor
-*  @param {object} options {client:client, data:{'type':'collection_type', 'key':'value'}, uuid:uuid}}
-*/
-Usergrid.Entity = function(options) {
-  if (options) {
-    this._data = options.data || {};
-    this._client = options.client || {};
+    //curl - append the path
+    curl += ' ' + uri;
+
+    //curl - add the body
+    if (body !== '"{}"' && method !== 'GET' && method !== 'DELETE') {
+      //curl - add in the json obj
+      curl += " -d '" + body + "'";
+    }
+
+    //log the curl command to the console
+    console.log(curl);
+
+    return curl;
+  }
+  Usergrid.Client.prototype.getDisplayImage = function(email, picture, size) {
+    try {
+      if (picture) {
+        return picture;
+      }
+      var size = size || 50;
+      if (email.length) {
+        return 'https://secure.gravatar.com/avatar/' + MD5(email) + '?s=' +
+          size;
+      } else {
+        return 'https://apigee.com/usergrid/img/user_profile.png';
+      }
+    } catch (e) {
+      return 'https://apigee.com/usergrid/img/user_profile.png';
+    }
   }
-};
 
-/*
- *  returns a serialized version of the entity object
- *
- *  Note: use the client.restoreEntity() function to restore
- *
- *  @method serialize
- *  @return {string} data
- */
-Usergrid.Entity.prototype.serialize = function () {
-  return JSON.stringify(this._data);
-}
+  /*
+   *  A class to Model a Usergrid Entity.
+   *  Set the type of entity in the 'data' json object
+   *
+   *  @constructor
+   *  @param {object} options {client:client, data:{'type':'collection_type', 'key':'value'}, uuid:uuid}}
+   */
+  Usergrid.Entity = function(options) {
+    if (options) {
+      this._data = options.data || {};
+      this._client = options.client || {};
+    }
+  };
 
-/*
-*  gets a specific field or the entire data object. If null or no argument
-*  passed, will return all data, else, will return a specific field
-*
-*  @method get
-*  @param {string} field
-*  @return {string} || {object} data
-*/
-Usergrid.Entity.prototype.get = function (field) {
-  if (field) {
-    return this._data[field];
-  } else {
-    return this._data;
+  /*
+   *  returns a serialized version of the entity object
+   *
+   *  Note: use the client.restoreEntity() function to restore
+   *
+   *  @method serialize
+   *  @return {string} data
+   */
+  Usergrid.Entity.prototype.serialize = function() {
+    return JSON.stringify(this._data);
   }
-}
 
-/*
-*  adds a specific key value pair or object to the Entity's data
-*  is additive - will not overwrite existing values unless they
-*  are explicitly specified
-*
-*  @method set
-*  @param {string} key || {object}
-*  @param {string} value
-*  @return none
-*/
-Usergrid.Entity.prototype.set = function (key, value) {
-  if (typeof key === 'object') {
-    for(var field in key) {
-      this._data[field] = key[field];
-    }
-  } else if (typeof key === 'string') {
-    if (value === null) {
-      delete this._data[key];
+  /*
+   *  gets a specific field or the entire data object. If null or no argument
+   *  passed, will return all data, else, will return a specific field
+   *
+   *  @method get
+   *  @param {string} field
+   *  @return {string} || {object} data
+   */
+  Usergrid.Entity.prototype.get = function(field) {
+    if (field) {
+      return this._data[field];
     } else {
-      this._data[key] = value;
+      return this._data;
     }
-  } else {
-    this._data = {};
   }
-}
 
-/*
-*  Saves the entity back to the database
-*
-*  @method save
-*  @public
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*/
-Usergrid.Entity.prototype.save = function (callback) {
-  var type = this.get('type');
-  var method = 'POST';
-  if (isUUID(this.get('uuid'))) {
-    method = 'PUT';
-    type += '/' + this.get('uuid');
-  }
-
-  //update the entity
-  var self = this;
-  var data = {};
-  var entityData = this.get();
-  //remove system specific properties
-  for (var item in entityData) {
-    if (item === 'metadata' || item === 'created' || item === 'modified' ||
-        item === 'type' || item === 'activated' || item ==='uuid') { continue; }
-    data[item] = entityData[item];
-  }
-  var options =  {
-    method:method,
-    endpoint:type,
-    body:data
-  };
-  //save the entity first
-  this._client.request(options, function (err, retdata) {
-    if (err && self._client.logging) {
-      console.log('could not save entity');
-      if (typeof(callback) === 'function') {
-        return callback(err, retdata, self);
+  /*
+   *  adds a specific key value pair or object to the Entity's data
+   *  is additive - will not overwrite existing values unless they
+   *  are explicitly specified
+   *
+   *  @method set
+   *  @param {string} key || {object}
+   *  @param {string} value
+   *  @return none
+   */
+  Usergrid.Entity.prototype.set = function(key, value) {
+    if (typeof key === 'object') {
+      for (var field in key) {
+        this._data[field] = key[field];
+      }
+    } else if (typeof key === 'string') {
+      if (value === null) {
+        delete this._data[key];
+      } else {
+        this._data[key] = value;
       }
     } else {
-      if (retdata.entities) {
-        if (retdata.entities.length) {
-          var entity = retdata.entities[0];
-          self.set(entity);
-          //for connections, API returns type
-          self.set('type', retdata.path);
-        }
+      this._data = {};
+    }
+  }
+
+  /*
+   *  Saves the entity back to the database
+   *
+   *  @method save
+   *  @public
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Entity.prototype.save = function(callback) {
+    var type = this.get('type');
+    var method = 'POST';
+    if (isUUID(this.get('uuid'))) {
+      method = 'PUT';
+      type += '/' + this.get('uuid');
+    }
+
+    //update the entity
+    var self = this;
+    var data = {};
+    var entityData = this.get();
+    //remove system specific properties
+    for (var item in entityData) {
+      if (item === 'metadata' || item === 'created' || item === 'modified' ||
+        item === 'type' || item === 'activated' || item === 'uuid') {
+        continue;
       }
-      //if this is a user, update the password if it has been specified;
-      var needPasswordChange = (self.get('type') === 'user' && entityData.oldpassword && entityData.newpassword);
-      if (needPasswordChange) {
-        //Note: we have a ticket in to change PUT calls to /users to accept the password change
-        //      once that is done, we will remove this call and merge it all into one
-        var pwdata = {};
-        pwdata.oldpassword = entityData.oldpassword;
-        pwdata.newpassword = entityData.newpassword;
-        var options = {
-          method:'PUT',
-          endpoint:type+'/password',
-          body:pwdata
+      data[item] = entityData[item];
+    }
+    var options = {
+      method: method,
+      endpoint: type,
+      body: data
+    };
+    //save the entity first
+    this._client.request(options, function(err, retdata) {
+      if (err && self._client.logging) {
+        console.log('could not save entity');
+        if (typeof(callback) === 'function') {
+          return callback(err, retdata, self);
         }
-        self._client.request(options, function (err, data) {
-          if (err && self._client.logging) {
-            console.log('could not update user');
+      } else {
+        if (retdata.entities) {
+          if (retdata.entities.length) {
+            var entity = retdata.entities[0];
+            self.set(entity);
+            //for connections, API returns type
+            self.set('type', retdata.path);
           }
-          //remove old and new password fields so they don't end up as part of the entity object
-          self.set('oldpassword', null);
-          self.set('newpassword', null);
-          if (typeof(callback) === 'function') {
-            callback(err, data, self);
+        }
+        //if this is a user, update the password if it has been specified;
+        var needPasswordChange = (self.get('type') === 'user' && entityData
+          .oldpassword && entityData.newpassword);
+        if (needPasswordChange) {
+          //Note: we have a ticket in to change PUT calls to /users to accept the password change
+          //      once that is done, we will remove this call and merge it all into one
+          var pwdata = {};
+          pwdata.oldpassword = entityData.oldpassword;
+          pwdata.newpassword = entityData.newpassword;
+          var options = {
+            method: 'PUT',
+            endpoint: type + '/password',
+            body: pwdata
           }
-        });
-      } else if (typeof(callback) === 'function') {
-        callback(err, retdata, self);
+          self._client.request(options, function(err, data) {
+            if (err && self._client.logging) {
+              console.log('could not update user');
+            }
+            //remove old and new password fields so they don't end up as part of the entity object
+            self.set('oldpassword', null);
+            self.set('newpassword', null);
+            if (typeof(callback) === 'function') {
+              callback(err, data, self);
+            }
+          });
+        } else if (typeof(callback) === 'function') {
+          callback(err, retdata, self);
+        }
       }
-    }
-  });
-}
+    });
+  }
 
-/*
-*  refreshes the entity by making a GET call back to the database
-*
-*  @method fetch
-*  @public
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*/
-Usergrid.Entity.prototype.fetch = function (callback) {
-  var type = this.get('type');
-  var self = this;
-
-  //if a uuid is available, use that, otherwise, use the name
-  if (this.get('uuid')) {
-    type += '/' + this.get('uuid');
-  } else {
-    if (type === 'users') {
-      if (this.get('username')) {
-        type += '/' + this.get('username');
-      } else {
-        if (typeof(callback) === 'function') {
-          var error = 'no_name_specified';
-          if (self._client.logging) {
-            console.log(error);
+  /*
+   *  refreshes the entity by making a GET call back to the database
+   *
+   *  @method fetch
+   *  @public
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   */
+  Usergrid.Entity.prototype.fetch = function(callback) {
+    var type = this.get('type');
+    var self = this;
+
+    //if a uuid is available, use that, otherwise, use the name
+    if (this.get('uuid')) {
+      type += '/' + this.get('uuid');
+    } else {
+      if (type === 'users') {
+        if (this.get('username')) {
+          type += '/' + this.get('username');
+        } else {
+          if (typeof(callback) === 'function') {
+            var error = 'no_name_specified';
+            if (self._client.logging) {
+              console.log(error);
+            }
+            return callback(true, {
+              error: error
+            }, self)
           }
-          return callback(true, {error:error}, self)
         }
-      }
-    } else if (type === 'a path') {
+      } else if (type === 'a path') {
 
-      ///TODO add code to deal with the type as a path
+        ///TODO add code to deal with the type as a path
 
-      if (this.get('path')) {
-        type += '/' + encodeURIComponent(this.get('name'));
-      } else {
-        if (typeof(callback) === 'function') {
-          var error = 'no_name_specified';
-          if (self._client.logging) {
-            console.log(error);
+        if (this.get('path')) {
+          type += '/' + encodeURIComponent(this.get('name'));
+        } else {
+          if (typeof(callback) === 'function') {
+            var error = 'no_name_specified';
+            if (self._client.logging) {
+              console.log(error);
+            }
+            return callback(true, {
+              error: error
+            }, self)
           }
-          return callback(true, {error:error}, self)
         }
-      }
 
-    } else {
-      if (this.get('name')) {
-        type += '/' + encodeURIComponent(this.get('name'));
       } else {
-        if (typeof(callback) === 'function') {
-          var error = 'no_name_specified';
-          if (self._client.logging) {
-            console.log(error);
+        if (this.get('name')) {
+          type += '/' + encodeURIComponent(this.get('name'));
+        } else {
+          if (typeof(callback) === 'function') {
+            var error = 'no_name_specified';
+            if (self._client.logging) {
+              console.log(error);
+            }
+            return callback(true, {
+              error: error
+            }, self)
           }
-          return callback(true, {error:error}, self)
         }
       }
     }
+    var options = {
+      method: 'GET',
+      endpoint: type
+    };
+    this._client.request(options, function(err, data) {
+      if (err && self._client.logging) {
+        console.log('could not get entity');
+      } else {
+        if (data.user) {
+          self.set(data.user);
+          self._json = JSON.stringify(data.user, null, 2);
+        } else if (data.entities) {
+          if (data.entities.length) {
+            var entity = data.entities[0];
+            self.set(entity);
+          }
+        }
+      }
+      if (typeof(callback) === 'function') {
+        callback(err, data, self);
+      }
+    });
   }
-  var options = {
-    method:'GET',
-    endpoint:type
-  };
-  this._client.request(options, function (err, data) {
-    if (err && self._client.logging) {
-      console.log('could not get entity');
+
+  /*
+   *  deletes the entity from the database - will only delete
+   *  if the object has a valid uuid
+   *
+   *  @method destroy
+   *  @public
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   *
+   */
+  Usergrid.Entity.prototype.destroy = function(callback) {
+    var type = this.get('type');
+    if (isUUID(this.get('uuid'))) {
+      type += '/' + this.get('uuid');
     } else {
-      if (data.user) {
-        self.set(data.user);
-        self._json = JSON.stringify(data.user, null, 2);
-      } else if (data.entities) {
-        if (data.entities.length) {
-          var entity = data.entities[0];
-          self.set(entity);
+      if (typeof(callback) === 'function') {
+        var error = 'Error trying to delete object - no uuid specified.';
+        if (self._client.logging) {
+          console.log(error);
         }
+        callback(true, error);
       }
     }
-    if (typeof(callback) === 'function') {
-      callback(err, data, self);
-    }
-  });
-}
-
-/*
-*  deletes the entity from the database - will only delete
-*  if the object has a valid uuid
-*
-*  @method destroy
-*  @public
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*
-*/
-Usergrid.Entity.prototype.destroy = function (callback) {
-  var type = this.get('type');
-  if (isUUID(this.get('uuid'))) {
-    type += '/' + this.get('uuid');
-  } else {
-    if (typeof(callback) === 'function') {
-      var error = 'Error trying to delete object - no uuid specified.';
-      if (self._client.logging) {
-        console.log(error);
+    var self = this;
+    var options = {
+      method: 'DELETE',
+      endpoint: type
+    };
+    this._client.request(options, function(err, data) {
+      if (err && self._client.logging) {
+        console.log('entity could not be deleted');
+      } else {
+        self.set(null);
       }
-      callback(true, error);
-    }
+      if (typeof(callback) === 'function') {
+        callback(err, data);
+      }
+    });
   }
-  var self = this;
-  var options = {
-    method:'DELETE',
-    endpoint:type
-  };
-  this._client.request(options, function (err, data) {
-    if (err && self._client.logging) {
-      console.log('entity could not be deleted');
-    } else {
-      self.set(null);
-    }
-    if (typeof(callback) === 'function') {
-      callback(err, data);
-    }
-  });
-}
 
-/*
-*  connects one entity to another
-*
-*  @method connect
-*  @public
-*  @param {string} connection
-*  @param {object} entity
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*
-*/
-Usergrid.Entity.prototype.connect = function (connection, entity, callback) {
+  /*
+   *  connects one entity to another
+   *
+   *  @method connect
+   *  @public
+   *  @param {string} connection
+   *  @param {object} entity
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   *
+   */
+  Usergrid.Entity.prototype.connect = function(connection, entity, callback) {
 
-  var self = this;
+    var self = this;
 
-  //connectee info
-  var connecteeType = entity.get('type');
-  var connectee = this.getEntityId(entity);
-  if (!connectee) {
-    if (typeof(callback) === 'function') {
-      var error = 'Error trying to delete object - no uuid specified.';
-      if (self._client.logging) {
-        console.log(error);
+    //connectee info
+    var connecteeType = entity.get('type');
+    var connectee = this.getEntityId(entity);
+    if (!connectee) {
+      if (typeof(callback) === 'function') {
+        var error = 'Error trying to delete object - no uuid specified.';
+        if (self._client.logging) {
+          console.log(error);
+        }
+        callback(true, error);
       }
-      callback(true, error);
+      return;
     }
-    return;
-  }
 
-  //connector info
-  var connectorType = this.get('type');
-  var connector = this.getEntityId(this);
-  if (!connector) {
-    if (typeof(callback) === 'function') {
-      var error = 'Error in connect - no uuid specified.';
-      if (self._client.logging) {
-        console.log(error);
+    //connector info
+    var connectorType = this.get('type');
+    var connector = this.getEntityId(this);
+    if (!connector) {
+      if (typeof(callback) === 'function') {
+        var error = 'Error in connect - no uuid specified.';
+        if (self._client.logging) {
+          console.log(error);
+        }
+        callback(true, error);
       }
-      callback(true, error);
+      return;
     }
-    return;
-  }
 
-  var endpoint = connectorType + '/' + connector + '/' + connection + '/' + connecteeType + '/' + connectee;
-  var options = {
-    method:'POST',
-    endpoint:endpoint
-  };
-  this._client.request(options, function (err, data) {
-    if (err && self._client.logging) {
-      console.log('entity could not be connected');
-    }
-    if (typeof(callback) === 'function') {
-      callback(err, data);
-    }
-  });
-}
+    var endpoint = connectorType + '/' + connector + '/' + connection + '/' +
+      connecteeType + '/' + connectee;
+    var options = {
+      method: 'POST',
+      endpoint: endpoint
+    };
+    this._client.request(options, function(err, data) {
+      if (err && self._client.logging) {
+        console.log('entity could not be connected');
+      }
+      if (typeof(callback) === 'function') {
+        callback(err, data);
+      }
+    });
+  }
 
-/*
-*  returns a unique identifier for an entity
-*
-*  @method connect
-*  @public
-*  @param {object} entity
-*  @param {function} callback
-*  @return {callback} callback(err, data)
-*
-*/
-Usergrid.Entity.prototype.getEntityId = function (entity) {
-  var id = false;
-  if (isUUID(entity.get('uuid'))) {
-    id = entity.get('uuid');
-  } else {
-    if (type === 'users') {
-      id = entity.get('username');
-    } else if (entity.get('name')) {
-      id = entity.get('name');
+  /*
+   *  returns a unique identifier for an entity
+   *
+   *  @method connect
+   *  @public
+   *  @param {object} entity
+   *  @param {function} callback
+   *  @return {callback} callback(err, data)
+   *
+   */
+  Usergrid.Entity.prototype.getEntityId = function(entity) {
+    var id = false;
+    if (isUUID(entity.get('uuid'))) {
+      id = entity.get('uuid');
+    } else {
+      if (type === 'users') {
+        id = entity.get('username');
+      } else if (entity.get('name')) {
+        id = entity.get('name');
+      }
     }
+    return id;
   }
-  return id;
-}
 
-/*
-*  gets an entities connections
-*
-*  @method getConnections
-*  @public
-*  @param {string} connection
-*  @param {object} entity
-*  @param {function} callback
-*  @return {callback} callback(err, data, connections)
-*
-*/
-Usergrid.Entity.prototype.getConnections = function (connection, callback) {
+  /*
+   *  gets an entities connections
+   *
+   *  @method getConnections
+   *  @public
+   *  @param {string} connection
+   *  @param {object} entity
+   *  @param {function} callback
+   *  @return {callback} callback(err, data, connections)
+   *
+   */
+  Usergrid.Entity.prototype.getConnections = function(connection, callback) {
 
-  var self = this;
+    var self = this;
 
-  //connector info
-  var connectorType = this.get('type');
-  var connector = this.getEntityId(this);
-  if (!connector) {
-    if (typeof(callback) === 'function') {
-      var error = 'Error in getConnections - no uuid specified.';
-      if (self._client.logging) {
-        console.log(error);
+    //connector info
+    var connectorType = this.get('type');
+    var connector = this.getEntityId(this);
+    if (!connector) {
+      if (typeof(callback) === 'function') {
+        var error = 'Error in getConnections - no uuid specified.';
+        if (self._client.logging) {
+          console.log(error);
+        }
+        callback(true, error);
       }
-      callback(true, error);
+      return;
     }
-    return;
-  }
 
-  var endpoint = connectorType + '/' + connector + '/' + connection + '/';
-  var options = {
-    method:'GET',
-    endpoint:endpoint
-  };
-  this._client.request(options, function (err, data) {
-    if (err && self._client.logging) {
-      console.log('entity could not be connected');
-    }
+    var endpoint = connectorType + '/' + connector + '/' + connection + '/';
+    var options = {
+      method: 'GET',
+      endpoint: endpoint
+    };
+    this._client.request(options, function(err, data) {
+      if (err && self._client.logging) {
+        console.log('entity could not be connected');
+      }
 
-    self[connection] = {};
+      self[connection] = {};
 
-    var length = data.entities.length;
-    for (var i=0;i<length;i++)
-    {
-      if (data.entities[i].type === 'user'){
-        self[connection][data.entities[i].username] = data.entities[i];
-      } else {
-        self[connection][data.entities[i].name] = data.entities[i]
+      var length = data.entities.length;
+      for (var i = 0; i < length; i++) {
+        if (data.entities[i].type === 'user') {
+          self[connection][data.entities[i].username] = data.entities[i];
+        } else {
+          self[connection][data.entities[i].name] = data.entities[i]
+        }
       }
-    }
 
-    if (typeof(callback) === 'function') {
-      callback(err, data, data.entities);
-    }
-  });
+      if (typeof(callback) === 'function') {
+        callback(err, data, data.entities);
+      }
+    });
 
-}
+  }
 
-Usergrid.Entity.prototype.getGroups = function (callback) {
+  Usergrid.Entity.prototype.getGroups = function(callback) {
 
-  var self = this;
+    var self = this;
 
-  var endpoint = 'users' + '/' + this.get('uuid') + '/groups' ;
-  var options = {
-    method:'GET',
-    endpoint:endpoint
-  };
-  this._client.request(options, function (err, data) {
-    if (err && self._client.logging) {
-      console.log('entity could not be connected');
-    }
+    var endpoint = 'users' + '/' + this.get('uuid') + '/groups';
+    var options = {
+      method: 'GET',
+      endpoint: endpoint
+    };
+    this._client.request(options, function(err, data) {
+      if (err && self._client.logging) {
+        console.log('entity could not be connected');
+      }
 
-    self['groups'] = data.entities;
+      self['groups'] = data.entities;
 
-    if (typeof(callback) === 'function') {
-      callback(err, data, data.entities);
-    }
-  });
+      if (typeof(callback) === 'function') {
+        callback(err, data, data.entities);
+      }
+    });
 
-}
+  }
 
-Usergrid.Entity.prototype.getActivities = function (callback) {
+  Usergrid.Entity.prototype.getActivities = function(callback) {
 
-  var self = this;
+    var self = this;
 
-  var endpoint = this.get('type') + '/' + this.get('uuid') + '/activities' ;
-  var options = {
-    method:'GET',
-    endpoint:endpoint
-  };
-  this._client.request(options, function (err, data) {
-    if (err && self._client.logging) {
-      console.log('entity could not be connected');
-    }
+    var endpoint = this.get('type') + '/' + this.get('uuid') + '/activities';
+    var options = {
+      method: 'GET',
+      endpoint: endpoint
+    };
+    this._client.request(options, function(err, data) {
+      if (err && self._client.logging) {
+        console.log('entity could not be connected');
+      }
 
-    for(entity in data.entities) {
-      data.entities[entity].createdDate = (new Date(data.entities[entity].created)).toUTCString();
-    }
+      for (entity in data.entities) {
+        data.entities[entity].createdDate = (new Date(data.entities[entity]
+          .created)).toUTCString();
+      }
 
-    self['activities'] = data.entities;
+      self['activities'] = data.entities;
 
-    if (typeof(callback) === 'function') {
-      callback(err, data, data.entities);
-    }
-  });
+      if (typeof(callback) === 'function') {
+        callback(err, data, data.entities);
+      }
+    });
+
+  }
 
-}
+  Usergrid.Entity.prototype.getFollowing = function(callback) {
 
-Usergrid.Entity.prototype.getFollowing = function (callback) {
+    var self = this;
 
-  var self = this;
+    var endpoint = 'users' + '/' + this.get('uuid') + '/following';
+    var options = {
+      method: 'GET',
+      endpoint: endpoint
+    };
+    this._client.request(options, function(err, data) {
+      if (err && self._client.logging) {
+        console.log('could not get user following');
+      }
 
-  var endpoint = 'users' + '/' + this.get('uuid') + '/following' ;
-  var options = {
-    method:'GET',
-    endpoint:endpoint
-  };
-  this._client.request(options, function (err, data) {
-    if (err && self._client.logging) {
-      console.log('could not get user following');
-    }
+      for (entity in data.entities) {
+        data.entities[entity].createdDate = (new Date(data.entities[entity]
+          .created)).toUTCString();
+        var image = self._client.getDisplayImage(data.entities[entity].email,
+          data.entities[entity].picture);
+        data.entities[entity]._portal_image_icon = image;
+      }
 
-    for(entity in data.entities) {
-      data.entities[entity].createdDate = (new Date(data.entities[entity].created)).toUTCString();
-      var image = self._client.getDisplayImage(data.entities[entity].email, data.entities[entity].picture);
-      data.entities[entity]._portal_image_icon =  image;
-    }
+      self['following'] = data.entities;
 
-    self['following'] = data.entities;
+      if (typeof(callback) === 'function') {
+        callback(err, data, data.entities);
+      }
+    });
 
-    if (typeof(callback) === 'function') {
-      callback(err, data, data.entities);
-    }
-  });
+  }
 
-}
 
+  Usergrid.Entity.prototype.getFollowers = function(callback) {
 
-Usergrid.Entity.prototype.getFollowers = function (callback) {
+    var self = this;
 
-  var self = this;
+    var endpoint = 'users' + '/' + this.get('uuid') + '/followers';
+    var options = {
+      method: 'GET',
+      endpoint: endpoint
+    };
+    this._client.request(options, function(err, data) {
+      if (err && self._client.logging) {
+        console.log('could not get user followers');
+      }
 
-  var endpoint = 'users' + '/' + this.get('uuid') + '/followers' ;
-  var options = {
-    method:'GET',
-    endpoint:endpoint
-  };
-  this._client.request(options, function (err, data) {
-    if (err && self._client.logging) {
-      console.log('could not get user followers');
-    }
+      for (entity in data.entities) {
+        data.entities[entity].createdDate = (new Date(data.entities[entity]
+          .created)).toUTCString();
+        var image = self._client.getDisplayImage(data.entities[entity].email,
+          data.entities[entity].picture);
+        data.entities[entity]._portal_image_icon = image;
+      }
 
-    for(entity in data.entities) {
-      data.entities[entity].createdDate = (new Date(data.entities[entity].created)).toUTCString();
-      var image = self._client.getDisplayImage(data.entities[entity].email, data.entities[entity].picture);
-      data.entities[entity]._portal_image_icon =  image;
-    }
+      self['followers'] = data.entities;
 
-    self['followers'] = data.entities;
+      if (typeof(callback) === 'function') {
+        callback(err, data, data.entities);
+      }
+    });
 
-    if (typeof(callback) === 'function') {
-      callback(err, data, data.entities);
-    }
-  });
+  }
 
-}
+  Usergrid.Entity.prototype.getRoles = function(callback) {
 
-Usergrid.Entity.pr

<TRUNCATED>