protected Operation transform(DeleteOperation delA, InsertOperation insB) {

    int posA = delA.getPosition();
    int lenA = delA.getTextLength();
    int posB = insB.getPosition();
    int lenB = insB.getTextLength();

    if (posB >= (posA + lenA)) {
      /*
       * Operation B is completely after operation A.
       */
      return delA;
    } else if (posB <= posA) {
      /*
       * Operation B starts before or at the same position like operation
       * A
       */
      return new DeleteOperation(posA + lenB, delA.getText());
    } else {
      /*
       * Operation B (insert) is in the range of operation A (delete).
       * Operation A' must be split up into two delete operations. (A):
       * "123456" (A'): "1" "23456"
       */
      DeleteOperation del1 = new DeleteOperation(posA, delA.getText().substring(0, posB - posA));
      DeleteOperation del2 =
          new DeleteOperation(posA + lenB, delA.getText().substring(posB - posA, lenA));
      return new SplitOperation(del1, del2);
    }
  }
  protected Operation transform(InsertOperation insA, DeleteOperation delB) {

    int posA = insA.getPosition();
    int posB = delB.getPosition();
    int lenB = delB.getTextLength();

    if (posA <= posB) {
      /*
       * Operation A starts before or at the same position like operation
       */
      return insA;
    } else if (posA > (posB + lenB)) {
      /*
       * Operation A starts after operation B. Index of operation A' must
       * be reduced by the length of the text of operation B.
       */
      return new InsertOperation(posA - lenB, insA.getText(), insA.getOrigin());
    } else {
      /*
       * Operation A starts in operation B. Index of A' must be the index
       * of operation B.
       */
      return new InsertOperation(posB, insA.getText(), insA.getOrigin());
    }
  }
  @Override
  public JsonObject visit(InsertOperation operation) throws Throwable {
    MobileServiceJsonTable table = this.getRemoteTable(operation.getTableName());
    table.setSystemProperties(EnumSet.allOf(MobileServiceSystemProperty.class));

    JsonObject item = removeSystemProperties(this.mItem);

    ListenableFuture<JsonObject> future = table.insert(item);

    try {
      return future.get();
    } catch (ExecutionException ex) {
      throw ex.getCause();
    }
  }
  protected Operation transform(
      InsertOperation insA, InsertOperation insB, boolean isTransformPrivileged) {

    int posA = insA.getPosition();
    int posB = insB.getPosition();
    int lenB = insB.getTextLength();
    if ((posA < posB)
        || ((posA == posB) && (insA.getOrigin() < insB.getOrigin()))
        || ((posA == posB) && (insA.getOrigin() == insB.getOrigin()) && isTransformPrivileged)) {
      /*
       * Operation A starts before operation B.
       */
      return insA;
    } else {
      /*
       * Operation A starts in or behind operation B. Index of operation
       * A' must be increased by the length of the text of operation B.
       */
      return new InsertOperation(posA + lenB, insA.getText(), insA.getOrigin());
    }
  }
Example #5
0
 @Override
 public String serializeOperation(Operation operation) throws SerializingMarshallingException {
   try {
     switch (operation.type()) {
       case InsertOperation.TYPE:
         {
           InsertOperation simpleOperation = (InsertOperation) operation;
           List<Object> operationAsList = new ArrayList<>();
           operationAsList.add(simpleOperation.getClass().getName());
           operationAsList.add(simpleOperation.table());
           operationAsList.add(simpleOperation.key());
           // TODO
           //                operationAsList.add( simpleOperation.fields() );
           return OBJECT_MAPPER.writeValueAsString(operationAsList);
         }
       case ReadOperation.TYPE:
         {
           ReadOperation simpleOperation = (ReadOperation) operation;
           List<Object> operationAsList = new ArrayList<>();
           operationAsList.add(simpleOperation.getClass().getName());
           operationAsList.add(simpleOperation.table());
           operationAsList.add(simpleOperation.key());
           operationAsList.add(simpleOperation.fields());
           return OBJECT_MAPPER.writeValueAsString(operationAsList);
         }
       case UpdateOperation.TYPE:
         {
           UpdateOperation simpleOperation = (UpdateOperation) operation;
           List<Object> operationAsList = new ArrayList<>();
           operationAsList.add(simpleOperation.getClass().getName());
           operationAsList.add(simpleOperation.table());
           operationAsList.add(simpleOperation.key());
           // TODO
           //                operationAsList.add( simpleOperation.fields() );
           return OBJECT_MAPPER.writeValueAsString(operationAsList);
         }
       case ScanOperation.TYPE:
         {
           ScanOperation simpleOperation = (ScanOperation) operation;
           List<Object> operationAsList = new ArrayList<>();
           operationAsList.add(simpleOperation.getClass().getName());
           operationAsList.add(simpleOperation.table());
           operationAsList.add(simpleOperation.startkey());
           operationAsList.add(simpleOperation.recordCount());
           operationAsList.add(simpleOperation.fields());
           return OBJECT_MAPPER.writeValueAsString(operationAsList);
         }
       case ReadModifyWriteOperation.TYPE:
         {
           ReadModifyWriteOperation simpleOperation = (ReadModifyWriteOperation) operation;
           List<Object> operationAsList = new ArrayList<>();
           operationAsList.add(simpleOperation.getClass().getName());
           operationAsList.add(simpleOperation.table());
           operationAsList.add(simpleOperation.key());
           operationAsList.add(simpleOperation.fields());
           // TODO
           //                operationAsList.add( simpleOperation.values() );
           return OBJECT_MAPPER.writeValueAsString(operationAsList);
         }
       default:
         {
           throw new SerializingMarshallingException(
               format(
                   "Workload does not know how to serialize operation\nWorkload: %s\nOperation Type: "
                       + "%s\nOperation: %s",
                   getClass().getName(), operation.getClass().getName(), operation));
         }
     }
   } catch (IOException e) {
     throw new SerializingMarshallingException(
         format("Error serializing operation\n%s", operation), e);
   }
 }