You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2016/10/24 13:06:17 UTC

[32/83] [abbrv] usergrid git commit: Moving older SDKs to a difference location and updating main README to link to new SDK locations.

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/UGQuery.h
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/UGQuery.h b/sdks/other/ios/UGAPI/UGQuery.h
new file mode 100755
index 0000000..b77e0a4
--- /dev/null
+++ b/sdks/other/ios/UGAPI/UGQuery.h
@@ -0,0 +1,104 @@
+/*
+ * 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.
+ */
+
+#import <Foundation/Foundation.h>
+#import <CoreLocation/CoreLocation.h>
+
+enum
+{
+    kUGQueryOperationEquals = 0,
+    kUGQueryOperationLessThan = 1,
+    kUGQueryOperationLessThanOrEqualTo = 2,
+    kUGQueryOperationGreaterThan = 3,
+    kUGQueryOperationGreaterThanOrEqualTo = 4
+};
+
+/***************************************************************
+ QUERY MANAGEMENT:
+ 
+ All query functions take one of these as an optional parameter
+ (the client may send nil if desired). This will specify the
+ limitations of the query. 
+***************************************************************/
+
+@interface UGQuery : NSObject
+
+// url terms used in UG searches. Set as you like.
+// These are convenience methods. the same effect can be done
+// by calling addURLTerm
+-(void)setConsumer: (NSString *)consumer;
+-(void)setLastUUID: (NSString *)lastUUID;
+-(void)setTime: (long)time;
+-(void)setPrev: (int)prev;
+-(void)setNext: (int)next;
+-(void)setLimit: (int)limit;
+-(void)setPos: (NSString *)pos;
+-(void)setUpdate: (BOOL)update;
+-(void)setSynchronized: (BOOL)synchronized;
+
+// a general function for adding additional URL terms.
+// Note that all of the set functions above turn around and
+// call this.
+-(void)addURLTerm: (NSString *)urlTerm equals:(NSString *)equals;
+
+// ql operation requirements. For each of these, you provide the term, followed 
+// by the operation (a kUGQueryOperationXXXX constant) followed by the value
+// in whatever form you have it (NSString, int, or float are supported)
+// Example: [foo addRequiredOperation: @"age" kUGQueryLessThan valueInt:27] would
+// add the term "age < 27" to the ql.
+-(void)addRequiredOperation: (NSString *)term op:(int)op valueStr:(NSString *)valueStr;
+-(void)addRequiredOperation: (NSString *)term op:(int)op valueInt:(int) valueInt;
+
+// adds a "contains" requirement to the query. This adds the requirement that a value
+// contain a given string. Example: [foo addRequiredContains:@"hobbies value:@"fishing"]
+// would add the term "hobbies contains 'fishing'" to the ql.
+-(void)addRequiredContains: (NSString *)term value:(NSString *)value;
+
+// adds an "in" requirement to the query. This adds a requirement that a field
+// be within a certain range. Example [foo appendRequiredIn:@"age" low:16.0 high:22.0]
+// would add the term "age in 16.0,22.0" to the ql. 
+// Note that the qualifier is inclusive, meaning it is true if low <= term <= high. 
+-(void)addRequiredIn:(NSString *)term low:(int)low high:(int)high;
+
+// adds a "within" requirement. This adds a constraint that the term be within a 
+// certain distance of the sent-in x,y coordinates.
+-(void)addRequiredWithin:(NSString *)term latitude:(float)latitude longitude:(float)longitude distance:(float)distance;
+
+// assembles a "within" requirement with a term name, CLLocation, and distance
+-(void)addRequiredWithinLocation:(NSString *)term location:(CLLocation *)location distance:(float)distance;
+
+//-------------------- Oblique usage ----------------------------
+// adds a requirement to the query. The requirements will
+// *all* be sent when the query is adopted. This is an escalating
+// list as you add them. Requirements are in UG Querty language.
+// So something like "firstname='bob'". This is one of the few places
+// where the data you give will be sent to the server almost untouched. 
+// So if you make a mistake in your query, you are likely to cause the whole
+// transaction to return an error. 
+// NOTE: This is different thant URL terms. These are query terms sent along
+// to the *single* URL term "ql". 
+// Note: This is an oblique-usage function. You will find all the ql operations
+// supported in the various addRequiredXXXX functions above. You would only use
+// this function if you already have ql strings prepared for some reason, or if
+// there are new ql format operations that are not supported by this API.
+-(void)addRequirement: (NSString *)requirement;
+
+// returns the URL-ready string that detailes all specified requirements.
+// This is used internally by UGClient, you don't need to call it.
+-(NSString *)getURLAppend;
+
+@end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/UGQuery.m
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/UGQuery.m b/sdks/other/ios/UGAPI/UGQuery.m
new file mode 100755
index 0000000..740ec5c
--- /dev/null
+++ b/sdks/other/ios/UGAPI/UGQuery.m
@@ -0,0 +1,277 @@
+/*
+ * 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.
+ */
+
+#import "UGQuery.h"
+#import "UGHTTPManager.h"
+
+@implementation UGQuery
+{
+    NSMutableArray *m_requirements;
+    NSMutableString *m_urlTerms;
+}
+
+-(id)init
+{
+    self = [super init];
+    if ( self )
+    {
+        m_requirements = [NSMutableArray new];
+        m_urlTerms = [NSMutableString new];
+    }
+    return self;
+}
+
+-(void)setConsumer: (NSString *)consumer
+{
+    [self addURLTerm:@"consumer" equals:consumer];    
+}
+
+-(void)setLastUUID: (NSString *)lastUUID
+{
+    [self addURLTerm:@"last" equals:lastUUID];    
+}
+
+-(void)setTime: (long)time
+{
+    NSMutableString *str = [NSMutableString new];
+    [str appendFormat:@"%ld", time];
+    [self addURLTerm:@"time" equals:str];
+}
+
+-(void)setPrev: (int)prev
+{
+    NSMutableString *str = [NSMutableString new];
+    [str appendFormat:@"%d", prev];
+    [self addURLTerm:@"prev" equals:str];
+}
+
+-(void)setNext: (int)next
+{
+    NSMutableString *str = [NSMutableString new];
+    [str appendFormat:@"%d", next];
+    [self addURLTerm:@"next" equals:str];
+}
+
+-(void)setLimit: (int)limit
+{
+    NSMutableString *str = [NSMutableString new];
+    [str appendFormat:@"%d", limit];
+    [self addURLTerm:@"limit" equals:str];
+}
+
+-(void)setPos: (NSString *)pos
+{
+    [self addURLTerm:@"pos" equals:pos];    
+}
+
+-(void)setUpdate: (BOOL)update
+{
+    if ( update )
+    {
+        [self addURLTerm:@"update" equals:@"true"];
+    }
+    else
+    {
+        [self addURLTerm:@"update" equals:@"false"];
+    }
+}
+
+-(void)setSynchronized: (BOOL)synchronized
+{
+    if ( synchronized )
+    {
+        [self addURLTerm:@"synchronized" equals:@"true"];
+    }
+    else
+    {
+        [self addURLTerm:@"synchronized" equals:@"false"];
+    }
+}
+
+-(void)addURLTerm: (NSString *)urlTerm equals:(NSString *)equals
+{
+    // ignore anything with a nil
+    if ( !urlTerm ) return;
+    if ( !equals ) return;
+
+    // escape the strings
+    NSString *escapedUrlTerm = [UGHTTPManager escapeSpecials:urlTerm];
+    NSString *escapedEquals = [UGHTTPManager escapeSpecials:equals];
+
+    // add it in
+    if ( [m_urlTerms length] > 0 )
+    {
+        // we already have some terms. Append an & before continuing
+        [m_urlTerms appendFormat:@"&"];
+    }
+    [m_urlTerms appendFormat:@"%@=%@", escapedUrlTerm, escapedEquals];
+}
+
+-(void)addRequiredOperation: (NSString *)term op:(int)op valueStr:(NSString *)valueStr
+{
+    // disregard invalid values
+    if ( !term ) return;
+    if ( !valueStr ) return;
+    
+    NSString *opStr = [self getOpStr: op];
+    if ( !opStr ) return; // nil opStr means they sent in an invalid op code
+    
+    // assemble the requirement string
+    NSMutableString *assembled = [NSMutableString new];
+    [assembled appendFormat:@"%@ %@ '%@'", term, opStr, valueStr];
+    
+    // add it as a req
+    [self addRequirement:assembled];
+}
+
+-(void)addRequiredOperation: (NSString *)term op:(int)op valueInt:(int) valueInt
+{
+    // disregard invalid values
+    if ( !term ) return;
+    
+    NSString *opStr = [self getOpStr: op];
+    if ( !opStr ) return; // nil opStr means they sent in an invalid op code
+    
+    // assemble the requirement string
+    NSMutableString *assembled = [NSMutableString new];
+    [assembled appendFormat:@"%@ %@ %d", term, opStr, valueInt];
+    
+    // add it as a req
+    [self addRequirement:assembled];
+}
+
+-(void)addRequiredContains: (NSString *)term value:(NSString *)value
+{
+    // disregard invalid values
+    if ( !term ) return;
+    if ( !value ) return;
+    
+    // assemble the requirement string
+    NSMutableString *assembled = [NSMutableString new];
+    [assembled appendFormat:@"%@ contains '%@'", term, value];
+    
+    // add it as a req
+    [self addRequirement:assembled];
+}
+
+-(void)addRequiredIn:(NSString *)term low:(int)low high:(int)high
+{
+    // disregard invalid values
+    if ( !term ) return;
+    
+    // assemble the requirement string
+    NSMutableString *assembled = [NSMutableString new];
+    [assembled appendFormat:@"%@ in %d,%d", term, low, high];
+    
+    // add it as a req
+    [self addRequirement:assembled];    
+}
+
+-(void)addRequiredWithin:(NSString *)term latitude:(float)latitude longitude:(float)longitude distance:(float)distance;
+{
+    // disregard invalid values
+    if ( !term ) return;
+    
+    // assemble the requirement string
+    NSMutableString *assembled = [NSMutableString new];
+    [assembled appendFormat:@"%@ within %f of %f,%f", term, distance, latitude, longitude];
+    
+    // add it as a req
+    [self addRequirement:assembled];   
+}
+
+-(void)addRequiredWithinLocation:(NSString *)term location:(CLLocation *)location distance:(float)distance
+{
+    [self addRequiredWithin:term latitude:location.coordinate.latitude longitude:location.coordinate.longitude distance:distance];
+}
+
+-(void)addRequirement: (NSString *)requirement
+{
+    // add the URL-ready requirement to our list
+    [m_requirements addObject:requirement];
+}
+
+-(NSString *)getURLAppend
+{    
+    // assemble a url append for all the requirements
+    // prep a mutable string
+    NSMutableString *ret = [NSMutableString new];
+    [ret setString:@"?"];
+  
+    // true if we've put anything in the string yet.
+    BOOL bHasContent = NO;
+    
+    // start with the ql term
+    if ( [m_requirements count] > 0 )
+    {    
+        // if we're here, there are queries
+        // assemble a single string for the ql
+        NSMutableString *ql = [NSMutableString new];
+        for ( int i=0 ; i<[m_requirements count] ; i++ )
+        {
+            if ( i>0 )
+            {
+                // connect terms
+                [ql appendFormat:@" and "];
+            }
+            [ql appendFormat:@"%@", [m_requirements objectAtIndex:i]];
+        }
+        
+        // escape it
+        NSString *escapedQL = [UGHTTPManager escapeSpecials:ql];
+        [ret appendFormat:@"ql=%@", escapedQL];
+        bHasContent = YES;
+    }
+
+    if ( [m_urlTerms length] > 0 )
+    {
+        if ( bHasContent ) 
+        {
+            [ret appendFormat:@"&%@", m_urlTerms];
+        }
+        else 
+        {
+            [ret appendFormat:@"%@", m_urlTerms];
+        }
+        bHasContent = YES;
+    }
+    
+    if ( !bHasContent )
+    {
+        // no content
+        return @"";
+    }
+    
+    // all prepared
+    return ret;
+}
+
+// Internal function
+ -(NSString *)getOpStr:(int)op
+{
+    switch (op)
+    {
+        case kUGQueryOperationEquals: return @"=";
+        case kUGQueryOperationGreaterThan: return @">";
+        case kUGQueryOperationGreaterThanOrEqualTo: return @">=";
+        case kUGQueryOperationLessThan: return @"<";
+        case kUGQueryOperationLessThanOrEqualTo: return @"<=";
+    }
+    return nil;
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/UGUser.h
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/UGUser.h b/sdks/other/ios/UGAPI/UGUser.h
new file mode 100755
index 0000000..58e3b99
--- /dev/null
+++ b/sdks/other/ios/UGAPI/UGUser.h
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+#import <Foundation/Foundation.h>
+
+@interface UGUser : NSObject
+
+@property NSString *username;
+@property NSString *email;
+@property NSString *uuid;
+@property NSString *picture;
+
+@end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/UGUser.m
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/UGUser.m b/sdks/other/ios/UGAPI/UGUser.m
new file mode 100755
index 0000000..d683b6d
--- /dev/null
+++ b/sdks/other/ios/UGAPI/UGUser.m
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+#import "UGUser.h"
+
+@implementation UGUser
+
+@synthesize username;
+@synthesize email;
+@synthesize uuid;
+@synthesize picture;
+
+@end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/v2/UGConnection.h
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/v2/UGConnection.h b/sdks/other/ios/UGAPI/v2/UGConnection.h
new file mode 100644
index 0000000..d44c8e9
--- /dev/null
+++ b/sdks/other/ios/UGAPI/v2/UGConnection.h
@@ -0,0 +1,289 @@
+/*
+ * 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.
+ */
+//
+//  UGConnection.h
+//  UGAPIApp
+//
+//  Created by Tim Burks on 3/30/13.
+//
+//
+#import <Foundation/Foundation.h>
+
+@class UGHTTPResult;
+
+@interface UGConnection : NSObject
+
+// These three properties tie a  UGConnection to a specific application instance
+@property (nonatomic, strong) NSString *server;
+@property (nonatomic, strong) NSString *organization;
+@property (nonatomic, strong) NSString *application;
+
+// As a convenience, a sharedConnection object is available,
+// but any number of UGConnection objects may be created and separately configured.
++ (UGConnection *) sharedConnection;
+
+// Query helper: construct query dictionary from arguments
+- (NSMutableDictionary *) queryWithString:(NSString *) queryString
+                                    limit:(int) limit
+                                startUUID:(NSString *) startUUID
+                                   cursor:(NSString *) cursor
+                                 reversed:(BOOL) reversed;
+
+// Authentication helper: call this method with the result of a getAccessToken request.
+- (BOOL) authenticateWithResult:(UGHTTPResult *) result;
+
+// Authentication helper: use this to confirm that a connection has a usable access token.
+- (BOOL) isAuthenticated;
+
+//
+// Usergrid API methods
+//
+// The following calls return NSMutableURLRequest objects that can be used to make Usergrid API calls.
+// We recommend (but do not require) that they be made with instances of the UGHTTPClient class.
+//
+// The goal here is to directly expose the complete Usergrid API.
+//
+// This follows http://apigee.com/docs/usergrid/content/app-services-resources
+//
+
+// Access tokens http://apigee.com/docs/usergrid/content/accesstoken
+
+- (NSMutableURLRequest *) getAccessTokenForAdminWithUsername:(NSString *) username
+                                                    password:(NSString *) password;
+
+- (NSMutableURLRequest *) getAccessTokenForOrganizationWithClientID:(NSString *) clientID
+                                                       clientSecret:(NSString *) clientSecret;
+
+- (NSMutableURLRequest *) getAccessTokenForApplicationWithUsername:(NSString *) username
+                                                          password:(NSString *) password;
+
+- (NSMutableURLRequest *) getAccessTokenForApplicationWithClientID:(NSString *) clientID
+                                                      clientSecret:(NSString *) clientSecret;
+
+// Admin users http://apigee.com/docs/usergrid/content/admin-user
+
+- (NSMutableURLRequest *) createAdminUserWithValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) updateAdminUser:(NSString *) adminUserIdentifier
+                               withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) getAdminUser:(NSString *) adminUserIdentifier;
+
+- (NSMutableURLRequest *) setPasswordForAdminUser:(NSString *) adminUserIdentifier
+                                          toValue:(NSString *) password;
+
+- (NSMutableURLRequest *) initiatePasswordResetForAdminUser;
+
+- (NSMutableURLRequest *) completePasswordResetForAdminUserWithValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) activateAdminUser:(NSString *) adminUserIdentifier
+                                  withToken:(NSString *) token
+                   sendingConfirmationEmail:(BOOL) sendingConfirmationEmail;
+
+- (NSMutableURLRequest *) reactivateAdminUser:(NSString *) adminUserIdentifier;
+
+- (NSMutableURLRequest *) getActivityFeedForAdminUser:(NSString *) adminUserIdentifier;
+
+// Client authorization http://apigee.com/docs/usergrid/content/client-authorization
+
+- (NSMutableURLRequest *) authorizeClient:(NSString *) clientIdentifier withResponseType:(NSString *) responseType;
+
+// Organizations and Applications http://apigee.com/docs/usergrid/content/organization
+
+- (NSMutableURLRequest *) createOrganizationWithValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) getOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) activateOrganization:(NSString *) organizationIdentifier
+                                     withToken:(NSString *) token
+                      sendingConfirmationEmail:(BOOL) sendingConfirmationEmail;
+
+- (NSMutableURLRequest *) reactivateOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) generateClientCredentialsForOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) getClientCredentialsForOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) getActivityFeedForOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) createApplicationInOrganization:(NSString *) organizationIdentifier
+                                               withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) deleteApplication:(NSString *) applicationIdentifier
+                             inOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) generateClientCredentialsForApplication:(NSString *) applicationIdentifier
+                                                   inOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) getClientCredentialsForApplication:(NSString *) applicationIdentifier
+                                              inOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) getApplicationsInOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) addAdminUser:(NSString *) adminUserIdentifier
+                        toOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) getAdminUsersInOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) removeAdminUser:(NSString *) adminUserIdentifier
+                         fromOrganization:(NSString *) organizationIdentifier;
+
+- (NSMutableURLRequest *) getApplication:(NSString *) applicationIdentifier
+                          inOrganization:(NSString *) organizationIdentifier;
+
+// Activity http://apigee.com/docs/usergrid/content/activity
+
+- (NSMutableURLRequest *) createActivityForUser:(NSString *) userIdentifier
+                                     withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) createActivityForGroup:(NSString *) groupIdentifier
+                                      withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) createActivityForFollowersOfUser:(NSString *) userIdentifier
+                                                   inGroup:(NSString *) groupIdentifier
+                                                withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) getActivitiesForUser:(NSString *) userIdentifier;
+
+- (NSMutableURLRequest *) getActivitiesForGroup:(NSString *) groupIdentifier;
+
+- (NSMutableURLRequest *) getActivityFeedForUser:(NSString *) userIdentifier;
+
+- (NSMutableURLRequest *) getActivityFeedForGroup:(NSString *) groupIdentifier;
+
+// Assets
+
+- (NSMutableURLRequest *) getDataForAsset:(NSString *) assetIdentifier;
+
+- (NSMutableURLRequest *) postData:(NSData *) data
+                          forAsset:(NSString *) assetIdentifier;
+
+// Collections (aka General-purpose endpoints) http://apigee.com/docs/usergrid/content/general-purpose-endpoints
+
+- (NSMutableURLRequest *) createEntityInCollection:(NSString *) collection
+                                        withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) getEntity:(NSString *) entityIdentifier
+                       inCollection:(NSString *) collection;
+
+- (NSMutableURLRequest *) updateEntity:(NSString *) entityIdentifier
+                          inCollection:(NSString *) collection
+                            withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) deleteEntity:(NSString *) entityIdentifier
+                          inCollection:(NSString *) collection;
+
+- (NSMutableURLRequest *) getEntitiesInCollection:(NSString *) collection
+                                            limit:(int) limit;
+
+- (NSMutableURLRequest *) getEntitiesInCollection:(NSString *) collection
+                                       usingQuery:(NSDictionary *) query;
+
+- (NSMutableURLRequest *) updateEntitiesInCollection:(NSString *) collection
+                                          usingQuery:(NSDictionary *) query
+                                          withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) deleteEntitiesInCollection:(NSString *) collection;
+
+- (NSMutableURLRequest *) deleteEntitiesInCollection:(NSString *) collection
+                                          usingQuery:(NSDictionary *) query;
+
+
+// Devices http://apigee.com/docs/usergrid/content/device
+
+// there are no device-specific methods
+
+// Events and Counters http://apigee.com/docs/usergrid/content/events-and-counters
+
+- (NSMutableURLRequest *) createEventWithValues:(NSDictionary *) values;
+
+// Groups http://apigee.com/docs/usergrid/content/group
+
+- (NSMutableURLRequest *) createGroupWithValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) addUser:(NSString *) userIdentifier
+                          toGroup:(NSString *) groupIdentifier;
+
+- (NSMutableURLRequest *) getGroup:(NSString *) groupIdentifier;
+
+- (NSMutableURLRequest *) updateGroup:(NSString *) groupIdentifier
+                           withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) deleteUser:(NSString *) userIdentifier
+                           fromGroup:(NSString *) groupIdentifier;
+
+- (NSMutableURLRequest *) deleteGroup:(NSString *) groupIdentifier;
+
+- (NSMutableURLRequest *) getUsersInGroup:(NSString *) groupIdentifier;
+
+// Roles http://apigee.com/docs/usergrid/content/role
+
+- (NSMutableURLRequest *) createRoleWithValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) getRoles;
+
+- (NSMutableURLRequest *) deleteRole:(NSString *) roleName;
+
+- (NSMutableURLRequest *) getPermissionsForRole:(NSString *) roleName;
+
+- (NSMutableURLRequest *) addPermissionsToRole:(NSString *) roleName
+                                    withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) deletePermissionsFromRole:(NSString *) roleName
+                                       usingPattern:(NSString *) pattern;
+
+- (NSMutableURLRequest *) addUser:(NSString *)userIdentifier
+                           toRole:(NSString *)roleName;
+
+- (NSMutableURLRequest *) getUsersInRole:(NSString *) roleName;
+
+- (NSMutableURLRequest *) deleteUser:(NSString *) userIdentifier
+                            fromRole:(NSString *) roleName;
+
+// Users http://apigee.com/docs/usergrid/content/user
+
+- (NSMutableURLRequest *) createUserWithValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) setPasswordForUser:(NSString *) username
+                                  toPassword:(NSString *) newPassword
+                                fromPassword:(NSString *) oldPassword;
+
+- (NSMutableURLRequest *) getUser:(NSString *) username;
+
+- (NSMutableURLRequest *) updateUser:(NSString *) username
+                          withValues:(NSDictionary *) values;
+
+- (NSMutableURLRequest *) deleteUser:(NSString *) username;
+
+- (NSMutableURLRequest *) getUsersUsingQuery:(NSDictionary *) query;
+
+- (NSMutableURLRequest *) connectEntity:(NSString *) entity1
+                           inCollection:(NSString *) collection
+                               toEntity:(NSString *) entity2
+                    throughRelationship:(NSString *) relationship;
+
+- (NSMutableURLRequest *) disconnectEntity:(NSString *) entity1
+                              inCollection:(NSString *) collection
+                                fromEntity:(NSString *) entity2
+                       throughRelationship:(NSString *) relationship;
+
+- (NSMutableURLRequest *) getConnectionsToEntity:(NSString *) entity
+                                    inCollection:(NSString *) collection
+                             throughRelationship:(NSString *) relationship
+                                      usingQuery:(NSDictionary *) query;
+
+@end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/v2/UGConnection.m
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/v2/UGConnection.m b/sdks/other/ios/UGAPI/v2/UGConnection.m
new file mode 100644
index 0000000..48840b3
--- /dev/null
+++ b/sdks/other/ios/UGAPI/v2/UGConnection.m
@@ -0,0 +1,938 @@
+/*
+ * 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.
+ */
+//
+//  UGConnection.m
+//  UGAPIApp
+//
+//  Created by Tim Burks on 3/30/13.
+//
+//
+#import "UGHTTPHelpers.h"
+#import "UGHTTPResult.h"
+#import "UGConnection.h"
+
+static NSString *boolean_representation(BOOL value)
+{
+    return (value ? @"true" : @"false");
+}
+
+@interface UGConnection ()
+@property (nonatomic, strong) NSString *token;
+@property (nonatomic, strong) NSDate *tokenExpirationDate;
+@end
+
+@implementation UGConnection
+
++ (UGConnection *) sharedConnection
+{
+    static UGConnection *connection = nil;
+    if (!connection) {
+        connection = [[UGConnection alloc] init];
+    }
+    return connection;
+}
+
+- (id) init {
+    if (self = [super init]) {
+        self.server = @"http://api.usergrid.com";
+    }
+    return self;
+}
+
+- (UGConnection *) copy
+{
+    UGConnection *copy = [super copy];
+    copy.server = self.server;
+    copy.organization = self.organization;
+    copy.application = self.application;
+    copy.token = self.token;
+    copy.tokenExpirationDate = self.tokenExpirationDate;
+    return copy;
+}
+
+#pragma mark - Internal helpers -
+
+- (NSString *) root
+{
+    return [NSString stringWithFormat:@"%@/%@/%@", self.server, self.organization, self.application];
+}
+
+- (NSMutableURLRequest *) authorizedRequestWithMethod:(NSString *) method
+                                                 path:(NSString *) path
+                                                 body:(NSData *) body
+{
+    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:path]];
+    [request setHTTPMethod:method];
+    if (body) {
+        [request setHTTPBody:body];
+    }
+    if (self.token) {
+        [request setValue:[NSString stringWithFormat:@"Bearer %@", self.token] forHTTPHeaderField:@"Authorization"];
+    }
+    return request;
+}
+
+#pragma mark - External helpers -
+
+#pragma mark Queries
+
+- (NSMutableDictionary *) queryWithString:(NSString *) queryString
+                                    limit:(int) limit
+                                startUUID:(NSString *) startUUID
+                                   cursor:(NSString *) cursor
+                                 reversed:(BOOL) reversed
+{
+    NSMutableDictionary *query = [NSMutableDictionary dictionary];
+    if (queryString) {
+        query[@"ql"] = queryString;
+    }
+    if (limit > 0) {
+        query[@"limit"] = [NSNumber numberWithInt:limit];
+    }
+    if (startUUID) {
+        query[@"start"] = startUUID;
+    }
+    if (cursor) {
+        query[@"cursor"] = cursor;
+    }
+    if (reversed) {
+        query[@"reversed"] = @"true";
+    }
+    return query;
+}
+
+#pragma mark Authentication
+
+- (BOOL) authenticateWithResult:(UGHTTPResult *) result
+{
+    id results = result.object;
+    self.token = results[@"access_token"];
+    id expires = results[@"expires_in"];
+    self.tokenExpirationDate = [NSDate dateWithTimeIntervalSinceNow:[expires intValue]];
+    return [self isAuthenticated];
+}
+
+- (BOOL) isAuthenticated
+{
+    return (self.token &&
+            self.tokenExpirationDate &&
+            ([self.tokenExpirationDate compare:[NSDate date]] == NSOrderedDescending));
+}
+
+#pragma mark - Management API request generators -
+
+#pragma mark Access tokens
+// http://apigee.com/docs/usergrid/content/accesstoken
+
+- (NSMutableURLRequest *) getAccessTokenForAdminWithUsername:(NSString *) username
+                                                    password:(NSString *) password
+{
+    if (!username || !password) {
+        return nil;
+    }
+    NSDictionary *query = @{@"grant_type":@"password",
+                            @"username":username,
+                            @"password":password};
+    NSString *path = [NSMutableString stringWithFormat:@"%@/management/token?%@",
+                      self.server, [query URLQueryString]];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getAccessTokenForOrganizationWithClientID:(NSString *) clientID
+                                                       clientSecret:(NSString *) clientSecret
+{
+    if (!clientID || !clientSecret) {
+        return nil;
+    }
+    NSDictionary *query = @{@"grant_type":@"client_credentials",
+                            @"client_id":clientID,
+                            @"client_secret":clientSecret};
+    NSString *path = [NSMutableString stringWithFormat:@"%@/management/token?%@",
+                      self.server, [query URLQueryString]];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getAccessTokenForApplicationWithUsername:(NSString *) username
+                                                          password:(NSString *) password
+{
+    if (!username || !password) {
+        return nil;
+    }
+    NSDictionary *query = @{@"grant_type":@"password",
+                            @"username":username,
+                            @"password":password};
+    NSString *path = [NSMutableString stringWithFormat:@"%@/token?%@",
+                      self.root, [query URLQueryString]];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getAccessTokenForApplicationWithClientID:(NSString *) clientID
+                                                      clientSecret:(NSString *) clientSecret
+{
+    if (!clientID || !clientSecret) {
+        return nil;
+    }
+    NSDictionary *query = @{@"grant_type":@"client_credentials",
+                            @"client_id":clientID,
+                            @"client_secret":clientSecret};
+    NSString *path = [NSMutableString stringWithFormat:@"%@/token?%@",
+                      self.root, [query URLQueryString]];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+#pragma mark Admin users
+// http://apigee.com/docs/usergrid/content/admin-user
+
+- (NSMutableURLRequest *) createAdminUserWithValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/users",
+                      self.server];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) updateAdminUser:(NSString *) adminUserIdentifier
+                               withValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/users/%@",
+                      self.server, adminUserIdentifier];
+    return [self authorizedRequestWithMethod:@"PUT"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) getAdminUser:(NSString *) adminUserIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/users/%@",
+                      self.server, adminUserIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) setPasswordForAdminUser:(NSString *) adminUserIdentifier
+                                          toValue:(NSString *) password
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/users/%@/password",
+                      self.server, adminUserIdentifier];
+    NSDictionary *values = @{@"password":password};
+    return [self authorizedRequestWithMethod:@"PUT"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) initiatePasswordResetForAdminUser
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/users/resetpw",
+                      self.server];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) completePasswordResetForAdminUserWithValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/users/resetpw",
+                      self.server];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) activateAdminUser:(NSString *) adminUserIdentifier
+                                  withToken:(NSString *) token
+                   sendingConfirmationEmail:(BOOL) sendingConfirmationEmail
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/users/%@/activate",
+                      self.server, adminUserIdentifier];
+    NSDictionary *values = @{@"token":token,
+                             @"confirm_email":boolean_representation(sendingConfirmationEmail)};
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) reactivateAdminUser:(NSString *) adminUserIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/users/%@/reactivate",
+                      self.server, adminUserIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getActivityFeedForAdminUser:(NSString *) adminUserIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/users/%@/feed",
+                      self.server, adminUserIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+#pragma mark Client authorization
+// http://apigee.com/docs/usergrid/content/client-authorization
+
+- (NSMutableURLRequest *) authorizeClient:(NSString *) clientIdentifier withResponseType:(NSString *) responseType
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/authorize",
+                      self.server];
+    NSDictionary *values = @{@"response_type":responseType,
+                             @"client_id":clientIdentifier};
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+
+#pragma mark Organizations and Applications
+// http://apigee.com/docs/usergrid/content/organization
+
+- (NSMutableURLRequest *) createOrganizationWithValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations",
+                      self.server];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) getOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@",
+                      self.server, organizationIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) activateOrganization:(NSString *) organizationIdentifier
+                                     withToken:(NSString *) token
+                      sendingConfirmationEmail:(BOOL) sendingConfirmationEmail
+{
+    NSDictionary *values = @{@"token":token,
+                             @"confirm_email":boolean_representation(sendingConfirmationEmail)};
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/activate?%@",
+                      self.server, organizationIdentifier, [values URLQueryString]];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) reactivateOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/reactivate",
+                      self.server, organizationIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) generateClientCredentialsForOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/credentials",
+                      self.server, organizationIdentifier];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getClientCredentialsForOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/credentials",
+                      self.server, organizationIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getActivityFeedForOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/feed",
+                      self.server, organizationIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) createApplicationInOrganization:(NSString *)organizationIdentifier withValues:(NSDictionary *)values
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/management/organizations/%@/applications",
+                      self.server, organizationIdentifier];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) deleteApplication:(NSString *) applicationIdentifier
+                             inOrganization:(NSString *)organizationIdentifier
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/management/organizations/%@/applications/%@",
+                      self.server, organizationIdentifier, applicationIdentifier];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) generateClientCredentialsForApplication:(NSString *) applicationIdentifier
+                                                   inOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/applications/%@/credentials",
+                      self.server, organizationIdentifier, applicationIdentifier];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getClientCredentialsForApplication:(NSString *) applicationIdentifier
+                                              inOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/applications/%@/credentials",
+                      self.server, organizationIdentifier, applicationIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getApplicationsInOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/management/organizations/%@/applications",
+                      self.server, organizationIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) addAdminUser:(NSString *) adminUserIdentifier
+                        toOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/users/%@",
+                      self.server, organizationIdentifier, adminUserIdentifier];
+    return [self authorizedRequestWithMethod:@"PUT"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getAdminUsersInOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/users",
+                      self.server, organizationIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) removeAdminUser:(NSString *) adminUserIdentifier
+                         fromOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSString stringWithFormat:@"%@/management/organizations/%@/users/%@",
+                      self.server, organizationIdentifier, adminUserIdentifier];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getApplication:(NSString *) applicationIdentifier
+                          inOrganization:(NSString *) organizationIdentifier
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/%@/%@",
+                      self.server, organizationIdentifier, applicationIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+#pragma mark - Application API request generators -
+
+#pragma mark Activity
+// http://apigee.com/docs/usergrid/content/activity
+
+- (NSMutableURLRequest *) createActivityForUser:(NSString *) userIdentifier
+                                     withValues:(NSDictionary *) values
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/users/%@/activities",
+                      self.root, userIdentifier];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) createActivityForGroup:(NSString *) groupIdentifier
+                                      withValues:(NSDictionary *) values
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/groups/%@/activities",
+                      self.root, groupIdentifier];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) createActivityForFollowersOfUser:(NSString *) userIdentifier
+                                                   inGroup:(NSString *) groupIdentifier
+                                                withValues:(NSDictionary *) values
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/groups/%@/users/%@/activities",
+                      self.root, groupIdentifier, userIdentifier];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+
+}
+
+- (NSMutableURLRequest *) getActivitiesForUser:(NSString *) userIdentifier
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/users/%@/activities",
+                      self.root, userIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getActivitiesForGroup:(NSString *) groupIdentifier
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/groups/%@/activities",
+                      self.root, groupIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getActivityFeedForUser:(NSString *) userIdentifier
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/users/%@/feed",
+                      self.root, userIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getActivityFeedForGroup:(NSString *) groupIdentifier
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/groups/%@/feed",
+                      self.root, groupIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+#pragma mark Assets
+
+- (NSMutableURLRequest *) getDataForAsset:(NSString *) assetIdentifier
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/assets/%@/data",
+                      self.root, assetIdentifier];
+    NSMutableURLRequest *request = [self authorizedRequestWithMethod:@"GET"
+                                                                path:path
+                                                                body:nil];
+    return request;
+}
+
+- (NSMutableURLRequest *) postData:(NSData *) data
+                          forAsset:(NSString *) assetIdentifier
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/assets/%@/data",
+                      self.root,
+                      assetIdentifier];
+    NSMutableURLRequest *request = [self authorizedRequestWithMethod:@"POST"
+                                                                path:path
+                                                                body:data];
+    [request setValue:@"application/octet-stream" forHTTPHeaderField:@"Content-Type"];
+    return request;
+}
+
+#pragma mark General-purpose endpoints
+// http://apigee.com/docs/usergrid/content/general-purpose-endpoints
+
+- (NSMutableURLRequest *) createEntityInCollection:(NSString *) collection
+                                        withValues:(NSDictionary *)values
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/%@",
+                      self.root, collection];
+    NSError *error;
+    NSData *data = [NSJSONSerialization dataWithJSONObject:values options:0 error:&error];
+    if (!data) {
+        NSLog(@"%@", error);
+    }
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:data];
+}
+
+- (NSMutableURLRequest *) getEntity:(NSString *) entityIdentifier
+                       inCollection:(NSString *) collection
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/%@/%@",
+                      self.root, collection, entityIdentifier];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) updateEntity:(NSString *) entityIdentifier
+                          inCollection:(NSString *) collection
+                            withValues:(NSDictionary *) values {
+    NSString *path = [NSString stringWithFormat:@"%@/%@/%@", self.root, collection, entityIdentifier];
+    NSError *error;
+    NSData *data = [NSJSONSerialization dataWithJSONObject:values options:0 error:&error];
+    if (!data) {
+        NSLog(@"%@", error);
+    }
+    return [self authorizedRequestWithMethod:@"PUT"
+                                        path:path
+                                        body:data];
+}
+
+- (NSMutableURLRequest *) deleteEntity:(NSString *) entityIdentifier
+                          inCollection:(NSString *) collection
+{
+    NSString *path = [NSString stringWithFormat:@"%@/%@/%@", self.root, collection, entityIdentifier];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getEntitiesInCollection:(NSString *) collection
+                                            limit:(int) limit
+{
+    NSDictionary *query = [self queryWithString:@"select *"
+                                          limit:limit
+                                      startUUID:nil
+                                         cursor:nil
+                                       reversed:NO];
+    return [self getEntitiesInCollection:collection
+                              usingQuery:query];
+}
+
+- (NSMutableURLRequest *) getEntitiesInCollection:(NSString *) collection
+                                       usingQuery:(NSDictionary *) query
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/%@?%@",
+                      self.root,
+                      collection,
+                      [query URLQueryString]];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) updateEntitiesInCollection:(NSString *) collection
+                                          usingQuery:(NSDictionary *) query
+                                          withValues:(NSDictionary *) values
+{
+    NSString *path = [NSMutableString stringWithFormat:@"%@/%@?%@",
+                      self.root,
+                      collection,
+                      [query URLQueryString]];
+    return [self authorizedRequestWithMethod:@"PUT"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) deleteEntitiesInCollection:(NSString *) collection
+{
+    NSDictionary *query = [self queryWithString:@"select *"
+                                          limit:0
+                                      startUUID:nil
+                                         cursor:nil
+                                       reversed:NO];
+    return [self deleteEntitiesInCollection:collection
+                                 usingQuery:query];
+}
+
+- (NSMutableURLRequest *) deleteEntitiesInCollection:(NSString *) collection
+                                          usingQuery:(NSDictionary *) query
+{
+    NSString *path = [NSString stringWithFormat:@"%@/%@?%@", self.root, collection, [query URLQueryString]];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+#pragma mark Devices
+// http://apigee.com/docs/usergrid/content/device
+
+#pragma mark Events and Counters
+// http://apigee.com/docs/usergrid/content/events-and-counters
+
+- (NSMutableURLRequest *) createEventWithValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/events", self.root];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+#pragma mark Groups
+// http://apigee.com/docs/usergrid/content/group
+
+- (NSMutableURLRequest *) createGroupWithValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/groups", self.root];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) addUser:(NSString *) user
+                          toGroup:(NSString *) group
+{
+    NSString *path = [NSString stringWithFormat:@"%@/groups/%@/users/%@",
+                      self.root, group, user];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getGroup:(NSString *) groupName
+{
+    NSString *path = [NSString stringWithFormat:@"%@/groups/%@", self.root, groupName];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) updateGroup:(NSString *) groupName
+                           withValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/groups/%@",
+                      self.root, groupName];
+    return [self authorizedRequestWithMethod:@"PUT"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) deleteUser:(NSString *) user
+                           fromGroup:(NSString *) groupName
+{
+    NSString *path = [NSString stringWithFormat:@"%@/groups/%@/users/%@",
+                      self.root, groupName, user];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) deleteGroup:(NSString *) groupName
+{
+    NSString *path = [NSString stringWithFormat:@"%@/groups/%@",
+                      self.root, groupName];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getUsersInGroup:(NSString *) groupName
+{
+    NSString *path = [NSString stringWithFormat:@"%@/groups/%@/users",
+                      self.root, groupName];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+#pragma mark Roles
+// http://apigee.com/docs/usergrid/content/role
+
+- (NSMutableURLRequest *) createRoleWithValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/roles", self.root];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) getRoles
+{
+    NSString *path = [NSString stringWithFormat:@"%@/roles", self.root];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) deleteRole:(NSString *) roleName
+{
+    NSString *path = [NSString stringWithFormat:@"%@/roles/%@",
+                      self.root, roleName];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getPermissionsForRole:(NSString *) roleName
+{
+    NSString *path = [NSString stringWithFormat:@"%@/roles/%@",
+                      self.root, roleName];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) addPermissionsToRole:(NSString *) roleName
+                                    withValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/roles/%@/permissions",
+                      self.root, roleName];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) deletePermissionsFromRole:(NSString *) roleName
+                                       usingPattern:(NSString *) pattern
+{
+    NSString *path = [NSString stringWithFormat:@"%@/roles/%@/permissions?pattern=%@",
+                      self.root, roleName, pattern];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) addUser:(NSString *)user
+                           toRole:(NSString *)roleName
+{
+    NSString *path = [NSString stringWithFormat:@"%@/roles/%@/users/%@",
+                      self.root, roleName, user];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getUsersInRole:(NSString *) roleName
+{
+    NSString *path = [NSString stringWithFormat:@"%@/roles/%@/users",
+                      self.root, roleName];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) deleteUser:(NSString *) user
+                            fromRole:(NSString *) roleName
+{
+    NSString *path = [NSString stringWithFormat:@"%@/roles/%@/users/%@",
+                      self.root, roleName, user];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+#pragma mark Users
+// http://apigee.com/docs/usergrid/content/user
+
+- (NSMutableURLRequest *) createUserWithValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/users", self.root];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) setPasswordForUser:(NSString *) username
+                                  toPassword:(NSString *) newPassword
+                                fromPassword:(NSString *) oldPassword
+{
+    NSDictionary *query = @{@"newpassword":newPassword,
+                            @"oldpassword":oldPassword};
+    NSString *path = [NSString stringWithFormat:@"%@/users/%@/password",
+                      self.root, username];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:[query URLQueryData]];
+}
+
+- (NSMutableURLRequest *) getUser:(NSString *) username
+{
+    NSString *path = [NSString stringWithFormat:@"%@/users/%@",
+                      self.root, username];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) updateUser:(NSString *) username
+                          withValues:(NSDictionary *) values
+{
+    NSString *path = [NSString stringWithFormat:@"%@/users/%@",
+                      self.root, username];
+    return [self authorizedRequestWithMethod:@"PUT"
+                                        path:path
+                                        body:[values URLQueryData]];
+}
+
+- (NSMutableURLRequest *) deleteUser:(NSString *) username
+{
+    NSString *path = [NSString stringWithFormat:@"%@/users/%@",
+                      self.root, username];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getUsersUsingQuery:(NSDictionary *) query
+{
+    NSString *path = [NSString stringWithFormat:@"%@/users?%@",
+                      self.root, [query URLQueryString]];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) connectEntity:(NSString *) entity1
+                           inCollection:(NSString *) collection
+                               toEntity:(NSString *) entity2
+                    throughRelationship:(NSString *) relationship
+{
+    NSString *path = [NSString stringWithFormat:@"%@/%@/%@/%@/%@",
+                      self.root, collection, entity1, relationship, entity2];
+    return [self authorizedRequestWithMethod:@"POST"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) disconnectEntity:(NSString *) entity1
+                              inCollection:(NSString *) collection
+                                fromEntity:(NSString *) entity2
+                       throughRelationship:(NSString *) relationship
+{
+    NSString *path = [NSString stringWithFormat:@"%@/%@/%@/%@/%@",
+                      self.root, collection, entity1, relationship, entity2];
+    return [self authorizedRequestWithMethod:@"DELETE"
+                                        path:path
+                                        body:nil];
+}
+
+- (NSMutableURLRequest *) getConnectionsToEntity:(NSString *) entity
+                                    inCollection:(NSString *) collection
+                             throughRelationship:(NSString *) relationship
+                                      usingQuery:(NSDictionary *) query
+{
+    NSString *path = [NSString stringWithFormat:@"%@/%@/%@/%@?%@",
+                      self.root, collection, entity, relationship, [query URLQueryString]];
+    return [self authorizedRequestWithMethod:@"GET"
+                                        path:path
+                                        body:nil];
+}
+
+@end
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/v2/UGHTTPClient.h
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/v2/UGHTTPClient.h b/sdks/other/ios/UGAPI/v2/UGHTTPClient.h
new file mode 100644
index 0000000..64fe9be
--- /dev/null
+++ b/sdks/other/ios/UGAPI/v2/UGHTTPClient.h
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+#import <Foundation/Foundation.h>
+
+@class UGHTTPResult;
+
+typedef void (^UGHTTPCompletionHandler)(UGHTTPResult *result);
+typedef void (^UGHTTPProgressHandler)(CGFloat progress);
+
+@interface UGHTTPClient : NSObject
+#if TARGET_OS_IPHONE
+<NSURLConnectionDataDelegate>
+#endif
+
+@property (nonatomic, copy) UGHTTPCompletionHandler completionHandler;
+@property (nonatomic, copy) UGHTTPProgressHandler progressHandler;
+@property (readonly) CGFloat progress;
+@property (readonly) BOOL isRunning;
+
+- (id) initWithRequest:(NSMutableURLRequest *) request;
+
+- (UGHTTPResult *) connect;
+
+- (void) connectWithCompletionHandler:(UGHTTPCompletionHandler) completionHandler;
+
+- (void) connectWithCompletionHandler:(UGHTTPCompletionHandler) completionHandler
+                      progressHandler:(UGHTTPProgressHandler) progressHandler;
+
+- (void) cancel;
+
+@end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/v2/UGHTTPClient.m
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/v2/UGHTTPClient.m b/sdks/other/ios/UGAPI/v2/UGHTTPClient.m
new file mode 100644
index 0000000..38aee42
--- /dev/null
+++ b/sdks/other/ios/UGAPI/v2/UGHTTPClient.m
@@ -0,0 +1,161 @@
+/*
+ * 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.
+ */
+#import "UGHTTPClient.h"
+#import "UGHTTPResult.h"
+
+@interface UGHTTPClient ()
+@property (nonatomic, strong) NSMutableURLRequest *request;
+@property (nonatomic, strong) NSMutableData *data;
+@property (nonatomic, strong) NSHTTPURLResponse *response;
+@property (nonatomic, strong) NSURLConnection *connection;
+@end
+
+@implementation UGHTTPClient
+
+static int activityCount = 0;
+
++ (void) retainNetworkActivityIndicator {
+    activityCount++;
+#if TARGET_OS_IPHONE
+    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
+#endif
+}
+
++ (void) releaseNetworkActivityIndicator {
+    activityCount--;
+#if TARGET_OS_IPHONE
+    if (activityCount == 0) {
+        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
+    }
+#endif
+}
+
+- (id) initWithRequest:(NSMutableURLRequest *)request
+{
+    if (self = [super init]) {
+        self.request = request;
+    }
+    return self;
+}
+
+- (UGHTTPResult *) connect {
+    NSHTTPURLResponse *response;
+    NSError *error;
+    UGHTTPResult *result = [[UGHTTPResult alloc] init];
+    result.data = [NSURLConnection sendSynchronousRequest:self.request returningResponse:&response error:&error];
+    result.response = response;
+    result.error = error;
+    if (self.completionHandler) {
+        self.completionHandler(result);
+    }
+    return result;
+}
+
+- (void) connectWithCompletionHandler:(UGHTTPCompletionHandler)completionHandler
+                      progressHandler:(UGHTTPProgressHandler)progressHandler
+{
+   	[self.request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
+    self.data = nil;
+    self.response = nil;
+	self.completionHandler = completionHandler;
+    self.progressHandler = progressHandler;
+	self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self];
+    [isa retainNetworkActivityIndicator];
+}
+
+- (void) connectWithCompletionHandler:(UGHTTPCompletionHandler) completionHandler
+{
+    [self connectWithCompletionHandler:completionHandler progressHandler:nil];
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response
+{
+	self.response = response;
+    if (self.progressHandler) {
+        self.progressHandler(0.0);
+    }
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)newData
+{
+    if (!self.data) {
+        self.data = [NSMutableData dataWithData:newData];
+    } else {
+        [self.data appendData:newData];
+    }
+    if (self.progressHandler) {
+        long long expectedLength = [self.response expectedContentLength];
+        if (expectedLength > 0) {
+            CGFloat progress = ((CGFloat) [self.data length]) / expectedLength;
+            self.progressHandler(progress);
+        }
+    }
+}
+
+- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
+{
+    if (self.completionHandler) {
+        UGHTTPResult *result = [[UGHTTPResult alloc] init];
+        result.response = self.response;
+        result.data = self.data;
+        result.error = error;
+        self.completionHandler(result);
+    }
+	self.connection = nil;
+    self.data = nil;
+    [isa releaseNetworkActivityIndicator];
+}
+
+- (void)connectionDidFinishLoading:(NSURLConnection *)connection
+{
+    if (self.progressHandler) {
+        self.progressHandler(1.0);
+    }
+    if (self.completionHandler) {
+        UGHTTPResult *result = [[UGHTTPResult alloc] init];
+        result.response = self.response;
+        result.data = self.data;
+        result.error = nil;
+        //[self.data writeToFile:@"/tmp/data" atomically:NO];
+        self.completionHandler(result);
+    }
+    self.connection = nil;
+    self.data = nil;
+    [isa releaseNetworkActivityIndicator];
+}
+
+- (void) cancel {
+    if (self.connection) {
+        [self.connection cancel];
+    }
+    self.connection = nil;
+}
+
+- (BOOL) isRunning {
+    return (self.connection != nil);
+}
+
+- (CGFloat) progress {
+    long long expectedLength = [self.response expectedContentLength];
+    if (expectedLength > 0) {
+        return ((CGFloat) [self.data length]) / expectedLength;
+    } else {
+        return 0.0;
+    }
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/v2/UGHTTPHelpers.h
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/v2/UGHTTPHelpers.h b/sdks/other/ios/UGAPI/v2/UGHTTPHelpers.h
new file mode 100644
index 0000000..64c678a
--- /dev/null
+++ b/sdks/other/ios/UGAPI/v2/UGHTTPHelpers.h
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+ //
+//  UGHTTPHelpers.h
+//  UGHTTP
+//
+//  Created by Tim Burks on 2/24/12.
+//
+#import <Foundation/Foundation.h>
+
+@interface NSString (UGHTTPHelpers)
+- (NSString *) URLEncodedString;
+- (NSString *) URLDecodedString;
+- (NSDictionary *) URLQueryDictionary;
+@end
+
+@interface NSData (UGHTTPHelpers)
+- (NSDictionary *) URLQueryDictionary;
+@end
+
+@interface NSDictionary (UGHTTPHelpers)
+- (NSString *) URLQueryString;
+- (NSData *) URLQueryData;
+@end
+
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/v2/UGHTTPHelpers.m
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/v2/UGHTTPHelpers.m b/sdks/other/ios/UGAPI/v2/UGHTTPHelpers.m
new file mode 100644
index 0000000..9bad1b9
--- /dev/null
+++ b/sdks/other/ios/UGAPI/v2/UGHTTPHelpers.m
@@ -0,0 +1,162 @@
+/*
+ * 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.
+ */
+//
+//  UGHTTPHelpers.m
+//  UGHTTP
+//
+//  Created by Tim Burks on 2/24/12.
+//
+
+#import "UGHTTPHelpers.h"
+#import <wctype.h>
+
+static unichar char_to_int(unichar c)
+{
+    switch (c) {
+        case '0': return 0;
+        case '1': return 1;
+        case '2': return 2;
+        case '3': return 3;
+        case '4': return 4;
+        case '5': return 5;
+        case '6': return 6;
+        case '7': return 7;
+        case '8': return 8;
+        case '9': return 9;
+        case 'A': case 'a': return 10;
+        case 'B': case 'b': return 11;
+        case 'C': case 'c': return 12;
+        case 'D': case 'd': return 13;
+        case 'E': case 'e': return 14;
+        case 'F': case 'f': return 15;
+    }
+    return 0;                                     // not good
+}
+
+static char int_to_char[] = "0123456789ABCDEF";
+
+@implementation NSString (UGHTTPHelpers)
+
+- (NSString *) URLEncodedString
+{
+    NSMutableString *result = [NSMutableString string];
+    int i = 0;
+    const char *source = [self cStringUsingEncoding:NSUTF8StringEncoding];
+    unsigned long max = strlen(source);
+    while (i < max) {
+        unsigned char c = source[i++];
+        if (c == ' ') {
+            [result appendString:@"%20"];
+        }
+        else if (iswalpha(c) || iswdigit(c) || (c == '-') || (c == '.') || (c == '_') || (c == '~')) {
+            [result appendFormat:@"%c", c];
+        }
+        else {
+            [result appendString:[NSString stringWithFormat:@"%%%c%c", int_to_char[(c/16)%16], int_to_char[c%16]]];
+        }
+    }
+    return result;
+}
+
+- (NSString *) URLDecodedString
+{
+    int i = 0;
+    NSUInteger max = [self length];
+    char *buffer = (char *) malloc ((max + 1) * sizeof(char));
+    int j = 0;
+    while (i < max) {
+        char c = [self characterAtIndex:i++];
+        switch (c) {
+            case '+':
+                buffer[j++] = ' ';
+                break;
+            case '%':
+                buffer[j++] =
+                char_to_int([self characterAtIndex:i])*16
+                + char_to_int([self characterAtIndex:i+1]);
+                i = i + 2;
+                break;
+            default:
+                buffer[j++] = c;
+                break;
+        }
+    }
+    buffer[j] = 0;
+    NSString *result = [NSMutableString stringWithCString:buffer encoding:NSUTF8StringEncoding];
+    if (!result) result = [NSMutableString stringWithCString:buffer encoding:NSASCIIStringEncoding];
+    free(buffer);
+    return result;
+}
+
+- (NSDictionary *) URLQueryDictionary
+{
+    NSMutableDictionary *result = [NSMutableDictionary dictionary];
+    NSArray *pairs = [self componentsSeparatedByString:@"&"];
+    int i;
+    NSUInteger max = [pairs count];
+    for (i = 0; i < max; i++) {
+        NSArray *pair = [[pairs objectAtIndex:i] componentsSeparatedByString:@"="];
+        if ([pair count] == 2) {
+            NSString *key = [[pair objectAtIndex:0] URLDecodedString];
+            NSString *value = [[pair objectAtIndex:1] URLDecodedString];
+            [result setObject:value forKey:key];
+        }
+    }
+    return result;
+}
+
+@end
+
+@implementation NSDictionary (UGHTTPHelpers)
+
+- (NSString *) URLQueryString
+{
+    NSMutableString *result = [NSMutableString string];
+    NSEnumerator *keyEnumerator = [[[self allKeys] sortedArrayUsingSelector:@selector(compare:)] objectEnumerator];
+    id key;
+    while ((key = [keyEnumerator nextObject])) {
+        id value = [self objectForKey:key];
+        if (![value isKindOfClass:[NSString class]]) {
+            if ([value respondsToSelector:@selector(stringValue)]) {
+                value = [value stringValue];
+            }
+        }
+        if ([value isKindOfClass:[NSString class]]) {
+            if ([result length] > 0) [result appendString:@"&"];
+            [result appendString:[NSString stringWithFormat:@"%@=%@",
+                                  [key URLEncodedString],
+                                  [value URLEncodedString]]];
+        }
+    }
+    return [NSString stringWithString:result];
+}
+
+- (NSData *) URLQueryData
+{
+    return [[self URLQueryString] dataUsingEncoding:NSUTF8StringEncoding];
+}
+
+@end
+
+@implementation NSData (UGHTTPHelpers)
+
+- (NSDictionary *) URLQueryDictionary {
+    return [[[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding] URLQueryDictionary];
+}
+
+@end
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/v2/UGHTTPResult.h
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/v2/UGHTTPResult.h b/sdks/other/ios/UGAPI/v2/UGHTTPResult.h
new file mode 100644
index 0000000..e8faf9b
--- /dev/null
+++ b/sdks/other/ios/UGAPI/v2/UGHTTPResult.h
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+//
+//  UGHTTPResult.h
+//  UGAPIApp
+//
+//  Created by Tim Burks on 4/3/13.
+//
+//
+
+#import <Foundation/Foundation.h>
+
+@interface UGHTTPResult : NSObject
+@property (nonatomic, strong) NSHTTPURLResponse *response;
+@property (nonatomic, strong) NSData *data;
+@property (nonatomic, strong) NSError *error;
+@property (nonatomic, strong) id object;
+@property (nonatomic, readonly) NSString *UTF8String;
+
+@end
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ios/UGAPI/v2/UGHTTPResult.m
----------------------------------------------------------------------
diff --git a/sdks/other/ios/UGAPI/v2/UGHTTPResult.m b/sdks/other/ios/UGAPI/v2/UGHTTPResult.m
new file mode 100644
index 0000000..2e0e115
--- /dev/null
+++ b/sdks/other/ios/UGAPI/v2/UGHTTPResult.m
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+//
+//  UGHTTPResult.m
+//  UGAPIApp
+//
+//  Created by Tim Burks on 4/3/13.
+//
+//
+
+#import "UGHTTPResult.h"
+
+@implementation UGHTTPResult
+
+- (id) object {
+    if (!_object && !_error) {
+        NSError *error;
+        // NSLog(@"JSON %@", [[NSString alloc] initWithData:_data encoding:NSUTF8StringEncoding]);
+        _object = [NSJSONSerialization JSONObjectWithData:_data options:0 error:&error];
+        _error = error;
+        if (_error) {
+            NSLog(@"JSON ERROR: %@", [error description]);
+        }
+    }
+    return _object;
+}
+
+- (NSString *) UTF8String {
+    return [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];
+}
+
+@end
\ No newline at end of file