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

Reply via email to