Conflict management with n clients, n >= 2

  Description :

     - We have 4 boxes, a server A et three clients : B, C and D
     - first, A, B,C et D are synchronized
     - B change the title of /w/x/truc
     - C change the title of /w/x/truc
     - D change the title of /w/x/truc
     - We do the synchronization in this order : B, D and D
     - The server A takes the value of B (because nothing was changed on A)
     - there is a conflict between A and C
     - there is a conflict between A and D
     - So we get on the server A 2 Conflict objets and 1 local object, so that
       we can retrieve 3 different versions of the object
     - Clients C and D must know that there is a conflict from /w/x
       The SyncML protocol doesn't allow us to tell to the client that the
       conflict is on /w/x/truc
     - We have to be able to get on the server the 3 different objects
     - getSynchronizationState should return CONFLICT for each subscription
       in conflict.
     - for each Conflict object, we should have a getRemoteObject method wich
       returns the /w/x/truc object from C and the next Conflict should returns
       the object from D

  Result of getSynchronizationState :

     - In the case of a client with only one subscription, this is quite easy,
       we should returns the state of the subscription
     - In the case of the server, it is more complicated, we can have by the
       same time depending on subscribers the following states : CONFLICT,
       NOT_SYNCHRONIZED, SYNCHRONIZED...
     - So we have to give the state associated with the subscriber, so we should
       not returns only a state, but a mapping between subscribers and states
     - So we can deduce that we should have a result like this :
       [ [subscriber1,state1], [subscriber2,state2]...]

  Howto store conflicts :

     - We should take again the example with the server and the 3 clients
     - A, B, C et D are synchronized
     - B, C et D change the title and description of /w/x/truc
       and also the title and description of /w/x/machin
     - We do the synchronization in this order : B, D and D
     - The server A takes the value of B (because nothing was changed on A)
     - there is a conflict between A and C
     - there is a conflict between A and D
     - So we have on the server 2 local objects and 8 Conflict objects (DEPRECATED):
        - Conflict for /w/x/truc : title for subscription C (DEPRECATED)
        - Conflict for /w/x/truc : title for subscription D (DEPRECATED)
        - Conflict for /w/x/truc : description for subscription C (DEPRECATED)
        - Conflict for /w/x/truc : description for subscription D (DEPRECATED)
        - Conflict for /w/x/machin : title for subscription C (DEPRECATED)
        - Conflict for /w/x/machin : title for subscription D (DEPRECATED)
        - Conflict for /w/x/machin : description for subscription C (DEPRECATED)
        - Conflict for /w/x/machin : description for subscription D (DEPRECATED)
     - This is bad, we can do a getRemoteObject because in this case we get
       only a part of the remote object, we should have only 4 Conflicts
     - XXX I have to change immediatly the way of storing conflict in order to
       have the following list :
        - Conflict1 for /w/x/truc : title  and description for subscription C
        - Conflict2 for /w/x/truc : title  and description for subscription D
        - Conflict3 for /w/x/machin : title  and description for subscription C
        - Conflict4 for /w/x/machin : title  and description for subscription D
     - The good way is to store a list of xupdate on each Conflict

  Howto solve conflicts :

     - Let's says that we take the object given by Conflict 2 for /w/x/truc and
       we take the version given by the server for the object /w/x/machin
     - Do we have to solve conflict one by one or when we choose one version for
       one Conflict, it will remove other versions ???
       I guess the best way is to just solve conflict one by one, then we are still
       free to make another method wich solve for all versions by the same time.
     - So we have to do :
       Conflict2.setRemoteObject()
       Conflict1.setLocalObject() # wich is the version of D because of the previous call
       Conflict3.setLocalObject()
       Conflict4.setLocalObject()
     - May be we can do a global method, like :
       Conflict2.setGlobalRemoteObject() wich implicitly call
         Conflict1.setLocalObject()
       and Conflict3.setGlobalLocalObject() wich implicitly call
         Conflict4.setLocalObject()
     - Conflict2.setRemoteObject() have to apply all xupdate strings stored
       in Conflict2. Then it have to set the status as CONFLICT_CLIENT_WIN.
     - Conflict3.setLocalObject() have to set the status as CONFLICT_MERGE. How ??
         - Probably the best way is to call the synchronizationTool wich know everything
         about subscription and subscriber.
         - synchronizationtool.setLocalObject should have  as parameter: the conflict (wich
           store the subscriber), that's all
         - then we can look at the signature of the object, delete the corresponding
           Conflict, and if there is no conflict left, then we can set the signature
           as CONFLICT_MERGE
     - At this state, we do have the /w/x/truc of D, and the /w/x/machin of B, and
       there is no conflict left, at least on the server side.
     #- at the time of the next synchronization, the server should send is new version
       of /w/x/truc and /w/x/machin to B, C and D, so that everyone is synchronized
       without conflict.
