@Before
  public void setUp() throws Exception {
    EntityReferenceSerializer<String> localSerializer =
        mocker.getInstance(EntityReferenceSerializer.TYPE_STRING, "local");
    EntityReferenceSerializer<String> serializer =
        mocker.getInstance(EntityReferenceSerializer.TYPE_STRING, "default");

    // No locale provided.
    documentReference = new DocumentReference("wiki", "space", "name");
    documentReferenceString = serializer.serialize(documentReference);
    documentReferenceLocalString = localSerializer.serialize(documentReference);

    language = "en";
    renderedContent = "content";
    title = "title";
    version = "1.1";
    hidden = false;
    date = new Date();
    creationDate = new Date();

    authorReference = new DocumentReference("wiki", "space", "author");
    authorString = serializer.serialize(authorReference);
    authorDisplay = "Au Thor";

    creatorReference = new DocumentReference("wiki", "space", "Creator");
    creatorString = serializer.serialize(creatorReference);
    creatorDisplay = "Crea Tor";

    // Mock

    mockContext = mock(XWikiContext.class);
    Execution mockExecution = mocker.getInstance(Execution.class);
    ExecutionContext mockExecutionContext = new ExecutionContext();
    mockExecutionContext.setProperty(XWikiContext.EXECUTIONCONTEXT_KEY, mockContext);

    when(mockExecution.getContext()).thenReturn(mockExecutionContext);

    mockXWiki = mock(XWiki.class);
    mockDocument = mock(XWikiDocument.class);

    when(mockContext.getWiki()).thenReturn(mockXWiki);
    when(mockXWiki.getDocument(documentReference, mockContext)).thenReturn(mockDocument);

    when(mockDocument.getRealLanguage()).thenReturn(language);
    when(mockDocument.getTranslatedDocument(any(String.class), eq(mockContext)))
        .thenReturn(mockDocument);

    mockDab = mocker.getInstance(DocumentAccessBridge.class);
    when(mockDab.getDocument(documentReference)).thenReturn(mockDocument);

    BlockRenderer mockPlainRenderer = mocker.getInstance(BlockRenderer.class, "plain/1.0");
    doAnswer(
            new Answer<Object>() {
              public Object answer(InvocationOnMock invocation) {
                Object[] args = invocation.getArguments();

                WikiPrinter printer = (WikiPrinter) args[1];
                printer.print(renderedContent);

                return null;
              }
            })
        .when(mockPlainRenderer)
        .render(any(Block.class), any(WikiPrinter.class));

    when(mockDocument.getRenderedTitle(any(Syntax.class), eq(mockContext))).thenReturn(title);

    when(mockDocument.getVersion()).thenReturn(version);

    when(mockDocument.getAuthorReference()).thenReturn(authorReference);
    when(mockXWiki.getUserName(authorString, null, false, mockContext)).thenReturn(authorDisplay);

    when(mockDocument.getCreatorReference()).thenReturn(creatorReference);
    when(mockXWiki.getUserName(creatorString, null, false, mockContext)).thenReturn(creatorDisplay);

    when(mockDocument.getCreationDate()).thenReturn(creationDate);
    when(mockDocument.getContentUpdateDate()).thenReturn(date);

    when(mockDocument.isHidden()).thenReturn(hidden);
  }
  @Override
  public SolrInputDocument getSolrDocument(EntityReference entityReference)
      throws SolrIndexException, IllegalArgumentException {
    DocumentReference documentReference = new DocumentReference(entityReference);

    XWikiContext context = getXWikiContext();

    try {
      SolrInputDocument solrDocument = new SolrInputDocument();

      XWikiDocument translatedDocument = getTranslatedDocument(documentReference);

      solrDocument.addField(Fields.ID, getId(documentReference));
      addDocumentFields(documentReference, solrDocument);
      solrDocument.addField(Fields.TYPE, documentReference.getType().name());
      solrDocument.addField(Fields.FULLNAME, compactSerializer.serialize(documentReference));

      // Convert the XWiki syntax of document to plain text.
      WikiPrinter printer = new DefaultWikiPrinter();
      renderer.render(translatedDocument.getXDOM(), printer);

      // Same for document title
      String plainTitle = translatedDocument.getRenderedTitle(Syntax.PLAIN_1_0, context);

      // Get the rendered plain text title.
      solrDocument.addField(Fields.TITLE /* + USCORE + language */, plainTitle);
      solrDocument.addField(Fields.DOCUMENT_CONTENT /* + USCORE + language */, printer.toString());
      solrDocument.addField(Fields.VERSION, translatedDocument.getVersion());

      solrDocument.addField(
          Fields.AUTHOR, serializer.serialize(translatedDocument.getAuthorReference()));
      solrDocument.addField(
          Fields.CREATOR, serializer.serialize(translatedDocument.getCreatorReference()));
      solrDocument.addField(Fields.CREATIONDATE, translatedDocument.getCreationDate());
      solrDocument.addField(Fields.DATE, translatedDocument.getContentUpdateDate());

      // Document translations have their own hidden fields
      solrDocument.setField(Fields.HIDDEN, translatedDocument.isHidden());

      // Index the Comments and Objects in general. Use the original document to get the comment
      // objects since the
      // translated document is just a lightweight object containing the translated content and
      // title.

      // FIXME: What about the fact that all translations have the same comments? The field will get
      // copied to
      // each version. Maybe we should handle specially the original document.
      XWikiDocument originalDocument = getDocument(documentReference);

      // Comments. TODO: Is this particular handling of comments actually useful?
      addComments(solrDocument, originalDocument);

      // Objects
      for (Map.Entry<DocumentReference, List<BaseObject>> objects :
          originalDocument.getXObjects().entrySet()) {
        for (BaseObject object : objects.getValue()) {
          this.addObjectContent(solrDocument, object);
        }
      }

      return solrDocument;
    } catch (Exception e) {
      throw new SolrIndexException(
          String.format(
              "Failed to get input document for '%s'", serializer.serialize(documentReference)),
          e);
    }
  }
  @Test
  public void testImportUsersAndGroupsPreserveVersion()
      throws WikiStreamException, XWikiException, ParseException {
    UserInstanceOutputProperties outputProperties = new UserInstanceOutputProperties();

    outputProperties.setPreserveVersion(true);

    importFromXML("user1", outputProperties);

    // XWiki.user1

    XWikiDocument userDocument =
        this.oldcore
            .getMockXWiki()
            .getDocument(
                new DocumentReference("wiki1", "XWiki", "user1"), this.oldcore.getXWikiContext());

    Assert.assertFalse(userDocument.isNew());

    Assert.assertEquals(
        new DocumentReference("wiki1", "XWiki", "user1"), userDocument.getCreatorReference());
    Assert.assertEquals(toDate("2000-01-10 00:00:00.0 UTC"), userDocument.getCreationDate());
    Assert.assertEquals(
        new DocumentReference("wiki1", "XWiki", "user1"), userDocument.getAuthorReference());
    Assert.assertEquals(toDate("2000-01-11 00:00:00.0 UTC"), userDocument.getDate());
    Assert.assertEquals(toDate("2000-01-11 00:00:00.0 UTC"), userDocument.getContentUpdateDate());
    Assert.assertEquals(
        new DocumentReference("wiki1", "XWiki", "user1"), userDocument.getContentAuthorReference());
    Assert.assertEquals(false, userDocument.isMinorEdit());
    Assert.assertEquals("Import", userDocument.getComment());

    BaseObject userObject = userDocument.getXObject(USER_CLASS);
    Assert.assertEquals(0, userObject.getNumber());
    Assert.assertEquals("user1 first name", userObject.getStringValue("first_name"));
    Assert.assertEquals("user1 last name", userObject.getStringValue("last_name"));
    Assert.assertEquals("*****@*****.**", userObject.getStringValue("email"));
    Assert.assertEquals(1, userObject.getIntValue("active"));

    // XWiki.user2

    userDocument =
        this.oldcore
            .getMockXWiki()
            .getDocument(
                new DocumentReference("wiki1", "XWiki", "user2"), this.oldcore.getXWikiContext());

    Assert.assertFalse(userDocument.isNew());

    Assert.assertEquals(
        new DocumentReference("wiki1", "XWiki", "user2"), userDocument.getCreatorReference());
    Assert.assertEquals(toDate("2000-01-20 00:00:00.0 UTC"), userDocument.getCreationDate());
    Assert.assertEquals(
        new DocumentReference("wiki1", "XWiki", "user2"), userDocument.getAuthorReference());
    Assert.assertEquals(toDate("2000-01-21 00:00:00.0 UTC"), userDocument.getDate());
    Assert.assertEquals(toDate("2000-01-21 00:00:00.0 UTC"), userDocument.getContentUpdateDate());
    Assert.assertEquals(
        new DocumentReference("wiki1", "XWiki", "user2"), userDocument.getContentAuthorReference());
    Assert.assertEquals(false, userDocument.isMinorEdit());
    Assert.assertEquals("Import", userDocument.getComment());

    userObject = userDocument.getXObject(USER_CLASS);
    Assert.assertEquals(0, userObject.getNumber());
    Assert.assertEquals("user2 first name", userObject.getStringValue("first_name"));
    Assert.assertEquals("user2 last name", userObject.getStringValue("last_name"));
    Assert.assertEquals("*****@*****.**", userObject.getStringValue("email"));
    Assert.assertEquals(0, userObject.getIntValue("active"));

    // XWiki.group1

    XWikiDocument groupDocument =
        this.oldcore
            .getMockXWiki()
            .getDocument(
                new DocumentReference("wiki1", "XWiki", "group1"), this.oldcore.getXWikiContext());

    Assert.assertFalse(groupDocument.isNew());

    BaseObject groupMemberObject0 = groupDocument.getXObject(GROUP_CLASS, 0);
    Assert.assertEquals("XWiki.user1", groupMemberObject0.getStringValue("member"));
    BaseObject groupMemberObject1 = groupDocument.getXObject(GROUP_CLASS, 1);
    Assert.assertEquals("XWiki.user2", groupMemberObject1.getStringValue("member"));

    // XWiki.group2

    groupDocument =
        this.oldcore
            .getMockXWiki()
            .getDocument(
                new DocumentReference("wiki1", "XWiki", "group2"), this.oldcore.getXWikiContext());

    Assert.assertFalse(groupDocument.isNew());

    groupMemberObject0 = groupDocument.getXObject(GROUP_CLASS, 0);
    Assert.assertEquals("XWiki.group1", groupMemberObject0.getStringValue("member"));

    // XWiki.emptygroup

    groupDocument =
        this.oldcore
            .getMockXWiki()
            .getDocument(
                new DocumentReference("wiki1", "XWiki", "emptygroup"),
                this.oldcore.getXWikiContext());

    Assert.assertFalse(groupDocument.isNew());

    groupMemberObject0 = groupDocument.getXObject(GROUP_CLASS, 0);
    Assert.assertEquals("", groupMemberObject0.getStringValue("member"));
  }