Author: ericwa
Date: Mon Mar 24 06:51:01 2014
New Revision: 10622
URL: http://svn.gna.org/viewcvs/etoile?rev=10622&view=rev
Log:
COSynchronizerJSONClient, COSynchronizerJSONServer: add 'pause' feature
Modified:
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.h
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.m
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.h
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.m
trunk/Etoile/Frameworks/CoreObject/Tests/Synchronization/TestSynchronizerJSONTransport.m
Modified:
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.h
URL:
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.h?rev=10622&r1=10621&r2=10622&view=diff
==============================================================================
---
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.h
(original)
+++
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.h
Mon Mar 24 06:51:01 2014
@@ -16,11 +16,19 @@
- (void) JSONClient: (COSynchronizerJSONClient *)client
didStartSharingOnBranch: (COBranch *)aBranch;
@end
+
@interface COSynchronizerJSONClient : NSObject <COSynchronizerClientDelegate>
+{
+ NSMutableArray *queuedOutgoingMessages;
+ NSMutableArray *queuedIncomingMessages;
+ BOOL paused;
+}
@property (nonatomic, readwrite, strong) id<COSynchronizerJSONClientDelegate>
delegate;
@property (nonatomic, readwrite, weak) COSynchronizerClient *client;
- (void) receiveTextFromServer: (NSString *)text;
+@property (nonatomic, readwrite, assign) BOOL paused;
+
@end
Modified:
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.m
URL:
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.m?rev=10622&r1=10621&r2=10622&view=diff
==============================================================================
---
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.m
(original)
+++
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONClient.m
Mon Mar 24 06:51:01 2014
@@ -18,10 +18,24 @@
@synthesize delegate, client;
+- (instancetype) init
+{
+ SUPERINIT;
+ queuedOutgoingMessages = [NSMutableArray new];
+ queuedIncomingMessages = [NSMutableArray new];
+ return self;
+}
- (void) sendPropertyListToServer: (id)aPropertyList
{
NSString *text = [COSynchronizerJSONUtils serializePropertyList:
aPropertyList];
- [delegate JSONClient: self sendTextToServer: text];
+ if (paused)
+ {
+ [queuedOutgoingMessages addObject: text];
+ }
+ else
+ {
+ [delegate JSONClient: self sendTextToServer: text];
+ }
}
- (void) sendPushToServer: (COSynchronizerPushedRevisionsFromClientMessage
*)message
@@ -65,6 +79,18 @@
- (void) receiveTextFromServer:(NSString *)text
{
+ if (paused)
+ {
+ [queuedIncomingMessages addObject: text];
+ }
+ else
+ {
+ [self processIncomingText: text];
+ }
+}
+
+- (void) processIncomingText: (NSString *)text
+{
id propertyList = [COSynchronizerJSONUtils deserializePropertyList:
text];
NSString *type = propertyList[@"class"];
@@ -86,4 +112,49 @@
}
}
+- (void) processOutgoingText: (NSString *)text
+{
+ [delegate JSONClient: self sendTextToServer: text];
+}
+
+- (void) processQueuedIncomingMessages
+{
+ NSArray *incomingMessages = [NSArray arrayWithArray:
queuedIncomingMessages];
+ [queuedIncomingMessages removeAllObjects];
+ for (NSString *incomingMessage in incomingMessages)
+ {
+ [self processIncomingText: incomingMessage];
+ }
+}
+
+- (void) processQueuedOutgoingMessages
+{
+ NSArray *outgoingMessages = [NSArray arrayWithArray:
queuedOutgoingMessages];
+ [queuedOutgoingMessages removeAllObjects];
+ for (NSString *outgoingMessage in outgoingMessages)
+ {
+ [self processOutgoingText: outgoingMessage];
+ }
+}
+
+- (void) processQueuedMessages
+{
+ [self processQueuedIncomingMessages];
+ [self processQueuedOutgoingMessages];
+}
+
+- (BOOL) paused
+{
+ return paused;
+}
+
+- (void)setPaused:(BOOL)flag
+{
+ paused = flag;
+ if (!paused)
+ {
+ [self processQueuedMessages];
+ }
+}
+
@end
Modified:
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.h
URL:
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.h?rev=10622&r1=10621&r2=10622&view=diff
==============================================================================
---
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.h
(original)
+++
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.h
Mon Mar 24 06:51:01 2014
@@ -16,10 +16,17 @@
@end
@interface COSynchronizerJSONServer : NSObject <COSynchronizerServerDelegate>
+{
+ NSMutableDictionary *queuedOutgoingMessagesByClient;
+ NSMutableArray *queuedIncomingMessages;
+ BOOL paused;
+}
@property (nonatomic, readwrite, strong) id<COSynchronizerJSONServerDelegate>
delegate;
@property (nonatomic, readwrite, weak) COSynchronizerServer *server;
- (void) receiveText: (NSString *)text fromClient: (NSString *)aClient;
+@property (nonatomic, readwrite, assign) BOOL paused;
+
@end
Modified:
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.m
URL:
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.m?rev=10622&r1=10621&r2=10622&view=diff
==============================================================================
---
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.m
(original)
+++
trunk/Etoile/Frameworks/CoreObject/Synchronization/COSynchronizerJSONServer.m
Mon Mar 24 06:51:01 2014
@@ -18,10 +18,32 @@
@synthesize delegate, server;
+- (instancetype) init
+{
+ SUPERINIT;
+ queuedOutgoingMessagesByClient = [NSMutableDictionary new];
+ queuedIncomingMessages = [NSMutableArray new];
+ return self;
+}
+
- (void) sendPropertyList: (id)aPropertyList toClient: (NSString *)aClient
{
NSString *text = [COSynchronizerJSONUtils serializePropertyList:
aPropertyList];
- [delegate JSONServer: self sendText: text toClient: aClient];
+
+ if (paused)
+ {
+ NSMutableArray *userQueue =
queuedOutgoingMessagesByClient[aClient];
+ if (userQueue == nil)
+ {
+ userQueue = [NSMutableArray new];
+ queuedOutgoingMessagesByClient[aClient] = userQueue;
+ }
+ [userQueue addObject: text];
+ }
+ else
+ {
+ [delegate JSONServer: self sendText: text toClient: aClient];
+ }
}
- (void) sendResponseMessage:
(COSynchronizerResponseToClientForSentRevisionsMessage *)message
@@ -76,6 +98,18 @@
- (void) receiveText: (NSString *)text fromClient: (NSString *)aClient
{
+ if (paused)
+ {
+ [queuedIncomingMessages addObject: text];
+ }
+ else
+ {
+ [self processIncomingText: text];
+ }
+}
+
+- (void) processIncomingText: (NSString *)text
+{
id propertyList = [COSynchronizerJSONUtils deserializePropertyList:
text];
NSString *type = propertyList[@"class"];
@@ -89,4 +123,47 @@
}
}
+- (void) processQueuedIncomingMessages
+{
+ NSArray *incomingMessages = [NSArray arrayWithArray:
queuedIncomingMessages];
+ [queuedIncomingMessages removeAllObjects];
+ for (NSString *incomingMessage in incomingMessages)
+ {
+ [self processIncomingText: incomingMessage];
+ }
+}
+
+- (void) processQueuedOutgoingMessages
+{
+ for (NSString *aClient in queuedOutgoingMessagesByClient)
+ {
+ NSArray *messages = queuedOutgoingMessagesByClient[aClient];
+ for (NSString *text in messages)
+ {
+ [delegate JSONServer: self sendText: text toClient:
aClient];
+ }
+ }
+ [queuedOutgoingMessagesByClient removeAllObjects];
+}
+
+- (void) processQueuedMessages
+{
+ [self processQueuedIncomingMessages];
+ [self processQueuedOutgoingMessages];
+}
+
+- (BOOL) paused
+{
+ return paused;
+}
+
+- (void)setPaused:(BOOL)flag
+{
+ paused = flag;
+ if (!paused)
+ {
+ [self processQueuedMessages];
+ }
+}
+
@end
Modified:
trunk/Etoile/Frameworks/CoreObject/Tests/Synchronization/TestSynchronizerJSONTransport.m
URL:
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Tests/Synchronization/TestSynchronizerJSONTransport.m?rev=10622&r1=10621&r2=10622&view=diff
==============================================================================
---
trunk/Etoile/Frameworks/CoreObject/Tests/Synchronization/TestSynchronizerJSONTransport.m
(original)
+++
trunk/Etoile/Frameworks/CoreObject/Tests/Synchronization/TestSynchronizerJSONTransport.m
Mon Mar 24 06:51:01 2014
@@ -22,6 +22,8 @@
- (void) JSONServer: (COSynchronizerJSONServer *)server sendText: (NSString
*)text toClient: (NSString *)client
{
+ ETAssert(self.client1 != nil);
+ ETAssert(self.client2 != nil);
if ([client isEqualToString: @"client1"])
{
[self.client1 receiveTextFromServer: text];
@@ -38,6 +40,7 @@
- (void) JSONClient: (COSynchronizerJSONClient *)client sendTextToServer:
(NSString *)text
{
+ ETAssert(self.server != nil);
[self.server receiveText: text fromClient: client.client.clientID];
}
@@ -48,31 +51,129 @@
@end
-@interface TestSynchronizerJSONTransport : NSObject <UKTest>
+@interface TestSynchronizerJSONTransport : EditingContextTestCase <UKTest>
{
TestSynchronizerJSONTransportDelegate *transportDelegate;
- COSynchronizerJSONServer *server;
- COSynchronizerJSONClient *client1;
- COSynchronizerJSONClient *client2;
+ COSynchronizerJSONServer *jsonServer;
+ COSynchronizerJSONClient *jsonClient1;
+ COSynchronizerJSONClient *jsonClient2;
+
+ COSynchronizerServer *server;
+ COSynchronizerClient *client1;
+ COSynchronizerClient *client2;
+
+ COEditingContext *client1Ctx;
+ COEditingContext *client2Ctx;
}
@end
+#define CLIENT1_STORE_URL [NSURL fileURLWithPath: [@"~/TestStore2.sqlite"
stringByExpandingTildeInPath]]
+#define CLIENT2_STORE_URL [NSURL fileURLWithPath: [@"~/TestStore3.sqlite"
stringByExpandingTildeInPath]]
@implementation TestSynchronizerJSONTransport
- (id) init
{
SUPERINIT;
+
+ [[[COSQLiteStore alloc] initWithURL: CLIENT1_STORE_URL] clearStore];
+ [[[COSQLiteStore alloc] initWithURL: CLIENT2_STORE_URL] clearStore];
+
+ COPersistentRoot *serverPersistentRoot = [ctx
insertNewPersistentRootWithEntityName: @"UnorderedGroupNoOpposite"];
+ [ctx commit];
+
+ server = [[COSynchronizerServer alloc] initWithBranch:
serverPersistentRoot.currentBranch];
+
+ client1Ctx = [COEditingContext contextWithURL: CLIENT1_STORE_URL];
+ client1 = [[COSynchronizerClient alloc] initWithClientID: @"client1"
editingContext: client1Ctx];
+
+ client2Ctx = [COEditingContext contextWithURL: CLIENT2_STORE_URL];
+ client2 = [[COSynchronizerClient alloc] initWithClientID: @"client2"
editingContext: client2Ctx];
+
+ // Setup JSON stuff
+
transportDelegate = [TestSynchronizerJSONTransportDelegate new];
- server = [COSynchronizerJSONServer new];
- client1 = [COSynchronizerJSONClient new];
- client2 = [COSynchronizerJSONClient new];
- server.delegate = transportDelegate;
- client1.delegate = transportDelegate;
- client2.delegate = transportDelegate;
+ jsonServer = [COSynchronizerJSONServer new];
+ jsonClient1 = [COSynchronizerJSONClient new];
+ jsonClient2 = [COSynchronizerJSONClient new];
+ transportDelegate.server = jsonServer;
+ transportDelegate.client1 = jsonClient1;
+ transportDelegate.client2 = jsonClient2;
+
+ jsonServer.delegate = transportDelegate;
+ jsonServer.server = server;
+
+ jsonClient1.delegate = transportDelegate;
+ jsonClient1.client = client1;
+
+ jsonClient2.delegate = transportDelegate;
+ jsonClient2.client = client2;
+
+ server.delegate = jsonServer;
+ client1.delegate = jsonClient1;
+ client2.delegate = jsonClient2;
+
+ // Tell the server about the clients
+
+ ETAssert(client1.persistentRoot == nil);
+ ETAssert(client2.persistentRoot == nil);
+
+ [server addClientID: @"client1"];
+ [server addClientID: @"client2"];
+
+ ETAssert(client1.persistentRoot != nil);
+ ETAssert(client2.persistentRoot != nil);
return self;
}
+- (UnorderedGroupNoOpposite *) addAndCommitServerChild
+{
+ UnorderedGroupNoOpposite *serverChild1 = [[server.persistentRoot
objectGraphContext] insertObjectWithEntityName:
@"Anonymous.UnorderedGroupNoOpposite"];
+ [[[server.persistentRoot rootObject] mutableSetValueForKey:
@"contents"] addObject: serverChild1];
+ [server.persistentRoot commit];
+ return serverChild1;
+}
+
+- (UnorderedGroupNoOpposite *) addAndCommitClient1Child
+{
+ UnorderedGroupNoOpposite *clientChild1 = [[client1.persistentRoot
objectGraphContext] insertObjectWithEntityName:
@"Anonymous.UnorderedGroupNoOpposite"];
+ [[[client1.persistentRoot rootObject] mutableSetValueForKey:
@"contents"] addObject: clientChild1];
+ [client1.persistentRoot commit];
+ return clientChild1;
+}
+
+- (void) testServerEditWhilePausedAndClientReceivingWhilePaused
+{
+ jsonClient1.paused = YES;
+ jsonServer.paused = YES;
+
+ UnorderedGroupNoOpposite *serverChild1 = [self addAndCommitServerChild];
+
+ jsonServer.paused = NO;
+
+ UKIntsEqual(0, [[[client1.persistentRoot rootObject] contents] count]);
+
+ jsonClient1.paused = NO;
+
+ UKIntsEqual(1, [[[client1.persistentRoot rootObject] contents] count]);
+}
+
+- (void) testClientEditWhilePausedAndServerReceivingWhilePaused
+{
+ jsonClient1.paused = YES;
+ jsonServer.paused = YES;
+
+ UnorderedGroupNoOpposite *clientChild1 = [self
addAndCommitClient1Child];
+
+ jsonClient1.paused = NO;
+
+ UKIntsEqual(0, [[[server.persistentRoot rootObject] contents] count]);
+
+ jsonServer.paused = NO;
+
+ UKIntsEqual(1, [[[server.persistentRoot rootObject] contents] count]);
+}
+
@end
_______________________________________________
Etoile-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/etoile-cvs