/** @see DATADOC-202 */
  @Test
  public void executeDocumentWithCursorPreparer() {
    template.insert(new Person("Tom"));
    template.insert(new Person("Dick"));
    template.insert(new Person("Harry"));
    final List<String> names = new ArrayList<String>();
    template.executeQuery(
        new Query(),
        template.getCollectionName(Person.class),
        new DocumentCallbackHandler() {
          public void processDocument(DBObject dbObject) {
            String name = (String) dbObject.get("firstName");
            if (name != null) {
              names.add(name);
            }
          }
        },
        new CursorPreparer() {

          public DBCursor prepare(DBCursor cursor) {
            cursor.limit(1);
            return cursor;
          }
        });
    assertEquals(1, names.size());
    // template.remove(new Query(), Person.class);
  }
  @Test
  public void testEnsureIndex() throws Exception {

    Person p1 = new Person("Oliver");
    p1.setAge(25);
    template.insert(p1);
    Person p2 = new Person("Sven");
    p2.setAge(40);
    template.insert(p2);

    template
        .indexOps(Person.class)
        .ensureIndex(new Index().on("age", Order.DESCENDING).unique(Duplicates.DROP));

    DBCollection coll = template.getCollection(template.getCollectionName(Person.class));
    List<DBObject> indexInfo = coll.getIndexInfo();
    assertThat(indexInfo.size(), is(2));
    String indexKey = null;
    boolean unique = false;
    boolean dropDupes = false;
    for (DBObject ix : indexInfo) {
      if ("age_-1".equals(ix.get("name"))) {
        indexKey = ix.get("key").toString();
        unique = (Boolean) ix.get("unique");
        dropDupes = (Boolean) ix.get("dropDups");
      }
    }
    assertThat(indexKey, is("{ \"age\" : -1}"));
    assertThat(unique, is(true));
    assertThat(dropDupes, is(true));

    List<IndexInfo> indexInfoList = template.indexOps(Person.class).getIndexInfo();
    System.out.println(indexInfoList);
    assertThat(indexInfoList.size(), is(2));
    IndexInfo ii = indexInfoList.get(1);
    assertThat(ii.isUnique(), is(true));
    assertThat(ii.isDropDuplicates(), is(true));
    assertThat(ii.isSparse(), is(false));
    assertThat(ii.getFieldSpec().containsKey("age"), is(true));
    assertThat(ii.getFieldSpec().containsValue(Order.DESCENDING), is(true));
  }
 protected void cleanDb() {
   template.dropCollection(template.getCollectionName(Person.class));
   template.dropCollection(template.getCollectionName(PersonWithAList.class));
   template.dropCollection(template.getCollectionName(PersonWith_idPropertyOfTypeObjectId.class));
   template.dropCollection(template.getCollectionName(PersonWith_idPropertyOfTypeString.class));
   template.dropCollection(template.getCollectionName(PersonWithIdPropertyOfTypeObjectId.class));
   template.dropCollection(template.getCollectionName(PersonWithIdPropertyOfTypeString.class));
   template.dropCollection(template.getCollectionName(PersonWithIdPropertyOfTypeInteger.class));
   template.dropCollection(template.getCollectionName(PersonWithIdPropertyOfPrimitiveInt.class));
   template.dropCollection(template.getCollectionName(PersonWithIdPropertyOfTypeLong.class));
   template.dropCollection(template.getCollectionName(PersonWithIdPropertyOfPrimitiveLong.class));
   template.dropCollection(template.getCollectionName(TestClass.class));
 }