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