protected void longBootup() throws Exception {
    this.runner.longBootup();

    // Assert state
    List<MobileObject> beans =
        this.runner.getDeviceDatabase().readByStorage(this.runner.getService());
    assertTrue(
        "On Device Ticket service should not be empty!!!", (beans != null && !beans.isEmpty()));
    for (MobileObject currBean : beans) {
      this.assertBean(currBean, (Ticket) this.ticketConnector.read(currBean.getServerRecordId()));
    }
  }
 private void assertPart(MobileObject deviceBean, int index, List<Part> parts) {
   if (parts != null) {
     for (Part part : parts) {
       if (deviceBean.getValue("parts[" + index + "].name").equals(part.getName())) {
         return;
       }
     }
   }
   assertTrue(
       "Parts(Indexed Property) are not properly synchronized!!! Missing Part=["
           + deviceBean.getValue("parts[" + index + "].id")
           + "],["
           + deviceBean.getValue("parts[" + index + "].name")
           + "]",
       false);
 }
 private void assertNote(MobileObject deviceBean, int index, List<Note> notes) {
   if (notes != null) {
     for (Note note : notes) {
       if (deviceBean.getValue("notes[" + index + "].note").equals(note.getNote())) {
         return;
       }
     }
   }
   assertTrue(
       "Notes(Indexed Property) are not properly synchronized!!! Missing Note=["
           + deviceBean.getValue("notes[" + index + "].id")
           + "],["
           + deviceBean.getValue("notes[" + index + "].note")
           + "]",
       false);
 }
  protected void assertBootUpState() throws Exception {
    // Assert state
    List<MobileObject> beans =
        this.runner.getDeviceDatabase().readByStorage(this.runner.getService());
    assertTrue(
        "On Device Ticket service should not be empty!!!", (beans != null && !beans.isEmpty()));

    int loadedCount = 0;
    for (MobileObject currBean : beans) {
      if (!currBean.isProxy()) {
        loadedCount++;
        this.assertBean(currBean, (Ticket) this.ticketConnector.read(currBean.getServerRecordId()));
      }
    }

    assertTrue("On Device Ticket service should only have 2 loaded tickets", loadedCount == 2);
  }
 private void assertPart(MobileObject deviceBean, Part part) {
   BeanList deviceParts = IndexingAPIUtil.readList(deviceBean, "parts");
   for (int j = 0; j < deviceParts.size(); j++) {
     if (deviceBean.getValue("parts[" + j + "].name").equals(part.getName())) {
       return;
     }
   }
   assertTrue(
       "Parts(Indexed Property) are not properly synchronized!!! Missing Part=["
           + part.getId()
           + "],["
           + part.getName()
           + "]",
       false);
 }
 private void assertNote(MobileObject deviceBean, Note note) {
   BeanList deviceNotes = IndexingAPIUtil.readList(deviceBean, "notes");
   for (int j = 0; j < deviceNotes.size(); j++) {
     if (deviceBean.getValue("notes[" + j + "].note").equals(note.getNote())) {
       return;
     }
   }
   assertTrue(
       "Notes(Indexed Property) are not properly synchronized!!! Missing Note=["
           + note.getId()
           + "],["
           + note.getNote()
           + "]",
       false);
 }
  protected void updateDeviceObject(String objectId) throws Exception {
    List<MobileObject> beans =
        this.runner.getDeviceDatabase().readByStorage(this.runner.getService());
    MobileObject storedBean = null;
    for (MobileObject cour : beans) {
      if (cour.getValue("technician.name") != null && !cour.isProxy()) {
        storedBean = cour;
        break;
      }
    }

    MobileObject bean = this.runner.getDeviceDatabase().read(this.runner.getService(), objectId);

    bean.setValue("name", "name://updated");

    // Referenced Technician
    bean.setValue("technician.id", storedBean.getValue("technician.id"));
    bean.setValue("technician.employeeId", storedBean.getValue("technician.employeeId"));
    bean.setValue("technician.name", storedBean.getValue("technician.name"));
    bean.setValue("technician.status", storedBean.getValue("technician.status"));

    // Notes
    for (int i = 0; i < 2; i++) {
      BeanListEntry note = new BeanListEntry();
      note.setProperty("note", "note://" + i + "/updated");
      IndexingAPIUtil.addBean(bean, "notes", note);
    }

    // Parts
    for (int i = 0; i < 2; i++) {
      BeanListEntry part = new BeanListEntry();
      part.setProperty("name", "part://" + i + "/updated");
      IndexingAPIUtil.addBean(bean, "parts", part);
    }

    this.runner.update(bean);
  }
  protected String createNewDeviceObject() throws Exception {
    List<MobileObject> beans =
        this.runner.getDeviceDatabase().readByStorage(this.runner.getService());

    // Create the new ticket on the device
    MobileObject bean = null;
    for (MobileObject cour : beans) {
      if (!cour.isProxy() && !cour.isCreatedOnDevice()) {
        bean = cour;
        break;
      }
    }

    MobileObject newTicket = new MobileObject();
    newTicket.setStorageId(bean.getStorageId());

    newTicket.setValue("name", "This new refrigerator is broken");

    // Referenced Nested Properties
    newTicket.setValue("customerInfo.id", bean.getValue("customerInfo.id"));
    newTicket.setValue("customerInfo.customerId", bean.getValue("customerInfo.customerId"));
    newTicket.setValue("customerInfo.name", bean.getValue("customerInfo.name"));
    newTicket.setValue("customerInfo.comments", bean.getValue("customerInfo.comments"));

    // Notes
    for (int i = 0; i < 2; i++) {
      BeanListEntry note = new BeanListEntry();
      note.setProperty("note", "note://" + i + "/added");
      IndexingAPIUtil.addBean(newTicket, "notes", note);
    }

    // Parts
    for (int i = 0; i < 2; i++) {
      BeanListEntry part = new BeanListEntry();
      part.setProperty("name", "part://" + i + "/added");
      IndexingAPIUtil.addBean(newTicket, "parts", part);
    }

    this.runner.create(newTicket);

    return newTicket.getRecordId();
  }
  protected void assertBean(MobileObject deviceBean, Ticket serverBean) {
    // Asserting Object Ids
    if (!deviceBean.isCreatedOnDevice()) {
      assertEquals(
          "Object ids must match!!", deviceBean.getServerRecordId(), serverBean.getTicketId());
    }

    assertEquals("Ticket Names must match!!", deviceBean.getValue("name"), serverBean.getName());

    // Asserting Nested Properties
    if (serverBean.getCustomerInfo() != null) {
      assertEquals(
          "Customer Id must match!!",
          deviceBean.getValue("customerInfo.customerId"),
          serverBean.getCustomerInfo().getCustomerId());
      assertEquals(
          "Customer Name must match!!",
          deviceBean.getValue("customerInfo.name"),
          serverBean.getCustomerInfo().getName());
      assertEquals(
          "Customer Comments must match!!",
          deviceBean.getValue("customerInfo.comments"),
          serverBean.getCustomerInfo().getComments());
    }

    if (serverBean.getEquipment() != null) {
      assertEquals(
          "Equipment Name must match!!",
          deviceBean.getValue("equipment.name"),
          serverBean.getEquipment().getName());
    }

    if (serverBean.getTechnician() != null) {
      assertEquals(
          "Technician EmployeeId must match!!",
          deviceBean.getValue("technician.employeeId"),
          serverBean.getTechnician().getEmployeeId());
      assertEquals(
          "Technician Name must match!!",
          deviceBean.getValue("technician.name"),
          serverBean.getTechnician().getName());
      assertEquals(
          "Technician Status must match!!",
          deviceBean.getValue("technician.status"),
          serverBean.getTechnician().getStatus());
    }

    // Asserting Indexed Properties from Server to Device
    List<Note> notes = serverBean.getNotes();
    if (notes != null) {
      for (Note note : notes) {
        this.assertNote(deviceBean, note);
      }
    }

    List<Part> parts = serverBean.getParts();
    if (parts != null) {
      for (Part part : parts) {
        this.assertPart(deviceBean, part);
      }
    }

    // Asserting Indexed Properties from Device to Server
    BeanList deviceNotes = IndexingAPIUtil.readList(deviceBean, "notes");
    for (int i = 0; i < deviceNotes.size(); i++) {
      if (deviceBean.getValue("notes[" + i + "].note") != null) {
        this.assertNote(deviceBean, i, notes);
      }
    }

    BeanList deviceParts = IndexingAPIUtil.readList(deviceBean, "parts");
    for (int i = 0; i < deviceParts.size(); i++) {
      if (deviceBean.getValue("parts[" + i + "].name") != null) {
        this.assertPart(deviceBean, i, parts);
      }
    }
  }
  protected void printDeviceBean(MobileObject currBean) {
    log.info("Local Bean Id=" + currBean.getRecordId());
    log.info("Remote Bean Id=" + currBean.getServerRecordId());
    log.info("Ticket Id=" + currBean.getValue("ticketId"));
    log.info("Ticket Name=" + currBean.getValue("name"));

    log.info("Customer DB Id=" + currBean.getValue("customerInfo.id"));
    log.info("Customer Id=" + currBean.getValue("customerInfo.customerId"));
    log.info("Customer Name=" + currBean.getValue("customerInfo.name"));
    log.info("Customer Comments=" + currBean.getValue("customerInfo.comments"));

    log.info("Technician Id=" + currBean.getValue("technician.id"));
    log.info("Employee Id=" + currBean.getValue("technician.employeeId"));
    log.info("Technician Name=" + currBean.getValue("technician.name"));
    log.info("Technician Status=" + currBean.getValue("technician.status"));

    log.info("Equipment ID=" + currBean.getValue("equipment.id"));
    log.info("Equipment Name=" + currBean.getValue("equipment.name"));

    // Use better indexing API
    BeanList notes = IndexingAPIUtil.readList(currBean, "notes");
    for (int j = 0; j < notes.size(); j++) {
      BeanListEntry note = notes.getEntryAt(j);
      log.info("Note ID=" + note.getProperty("id"));
      log.info("Note=" + note.getProperty("note"));
    }

    // Use better indexing API
    BeanList parts = IndexingAPIUtil.readList(currBean, "parts");
    for (int j = 0; j < parts.size(); j++) {
      BeanListEntry part = parts.getEntryAt(j);
      log.info("Part ID=" + part.getProperty("id"));
      log.info("Part=" + part.getProperty("name"));
    }

    log.info("-----------------------------------------");
  }