com.aspose.words

Class Revision

  • java.lang.Object
    • com.aspose.words.Revision
public class Revision 
extends java.lang.Object

Represents a revision (tracked change) in a document node or style. Use RevisionType to check the type of this revision.

Example:

Shows how to work with revisions in a document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// Normal editing of the document does not count as a revision.
builder.write("This does not count as a revision. ");

Assert.assertFalse(doc.hasRevisions());

// To register our edits as revisions, we need to declare an author, and then start tracking them.
doc.startTrackRevisions("John Doe", new Date());

builder.write("This is revision #1. ");

Assert.assertTrue(doc.hasRevisions());
Assert.assertEquals(1, doc.getRevisions().getCount());

// This flag corresponds to the "Review" -> "Tracking" -> "Track Changes" option in Microsoft Word.
// The "StartTrackRevisions" method does not affect its value,
// and the document is tracking revisions programmatically despite it having a value of "false".
// If we open this document using Microsoft Word, it will not be tracking revisions.
Assert.assertFalse(doc.getTrackRevisions());

// We have added text using the document builder, so the first revision is an insertion-type revision.
Revision revision = doc.getRevisions().get(0);
Assert.assertEquals("John Doe", revision.getAuthor());
Assert.assertEquals("This is revision #1. ", revision.getParentNode().getText());
Assert.assertEquals(RevisionType.INSERTION, revision.getRevisionType());
Assert.assertEquals(revision.getDateTime().getDate(), new Date().getDate());
Assert.assertEquals(doc.getRevisions().getGroups().get(0), revision.getGroup());

// Remove a run to create a deletion-type revision.
doc.getFirstSection().getBody().getFirstParagraph().getRuns().get(0).remove();

// Adding a new revision places it at the beginning of the revision collection.
Assert.assertEquals(RevisionType.DELETION, doc.getRevisions().get(0).getRevisionType());
Assert.assertEquals(2, doc.getRevisions().getCount());

// Insert revisions show up in the document body even before we accept/reject the revision.
// Rejecting the revision will remove its nodes from the body. Conversely, nodes that make up delete revisions
// also linger in the document until we accept the revision.
Assert.assertEquals("This does not count as a revision. This is revision #1.", doc.getText().trim());

// Accepting the delete revision will remove its parent node from the paragraph text
// and then remove the collection's revision itself.
doc.getRevisions().get(0).accept();

Assert.assertEquals(1, doc.getRevisions().getCount());
Assert.assertEquals("This is revision #1.", doc.getText().trim());

builder.writeln("");
builder.write("This is revision #2.");

// Now move the node to create a moving revision type.
Node node = doc.getFirstSection().getBody().getParagraphs().get(1);
Node endNode = doc.getFirstSection().getBody().getParagraphs().get(1).getNextSibling();
Node referenceNode = doc.getFirstSection().getBody().getParagraphs().get(0);

while (node != endNode)
{
    Node nextNode = node.getNextSibling();
    doc.getFirstSection().getBody().insertBefore(node, referenceNode);
    node = nextNode;
}

Assert.assertEquals(RevisionType.MOVING, doc.getRevisions().get(0).getRevisionType());
Assert.assertEquals(8, doc.getRevisions().getCount());
Assert.assertEquals("This is revision #2.\rThis is revision #1. \rThis is revision #2.", doc.getText().trim());

// The moving revision is now at index 1. Reject the revision to discard its contents.
doc.getRevisions().get(1).reject();

Assert.assertEquals(6, doc.getRevisions().getCount());
Assert.assertEquals("This is revision #1. \rThis is revision #2.", doc.getText().trim());

Property Getters/Setters Summary
java.lang.StringgetAuthor()
void
setAuthor(java.lang.Stringvalue)
           Gets or sets the author of this revision. Can not be empty string or null.
java.util.DategetDateTime()
void
setDateTime(java.util.Datevalue)
           Gets or sets the date/time of this revision.
RevisionGroupgetGroup()
Gets the revision group. Returns null if the revision does not belong to any group.
NodegetParentNode()
Gets the immediate parent node (owner) of this revision. This property will work for any revision type other than RevisionType.STYLE_DEFINITION_CHANGE.
StylegetParentStyle()
Gets the immediate parent style (owner) of this revision. This property will work for only for the RevisionType.STYLE_DEFINITION_CHANGE revision type.
intgetRevisionType()
Gets the type of this revision. The value of the property is RevisionType integer constant.
 
Method Summary
voidaccept()
Accepts this revision.
voidreject()
Reject this revision.
 

    • Property Getters/Setters Detail

      • getAuthor/setAuthor

        public java.lang.String getAuthor() / public void setAuthor(java.lang.String value)
        
        Gets or sets the author of this revision. Can not be empty string or null.

        Example:

        Shows how to work with revisions in a document.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        // Normal editing of the document does not count as a revision.
        builder.write("This does not count as a revision. ");
        
        Assert.assertFalse(doc.hasRevisions());
        
        // To register our edits as revisions, we need to declare an author, and then start tracking them.
        doc.startTrackRevisions("John Doe", new Date());
        
        builder.write("This is revision #1. ");
        
        Assert.assertTrue(doc.hasRevisions());
        Assert.assertEquals(1, doc.getRevisions().getCount());
        
        // This flag corresponds to the "Review" -> "Tracking" -> "Track Changes" option in Microsoft Word.
        // The "StartTrackRevisions" method does not affect its value,
        // and the document is tracking revisions programmatically despite it having a value of "false".
        // If we open this document using Microsoft Word, it will not be tracking revisions.
        Assert.assertFalse(doc.getTrackRevisions());
        
        // We have added text using the document builder, so the first revision is an insertion-type revision.
        Revision revision = doc.getRevisions().get(0);
        Assert.assertEquals("John Doe", revision.getAuthor());
        Assert.assertEquals("This is revision #1. ", revision.getParentNode().getText());
        Assert.assertEquals(RevisionType.INSERTION, revision.getRevisionType());
        Assert.assertEquals(revision.getDateTime().getDate(), new Date().getDate());
        Assert.assertEquals(doc.getRevisions().getGroups().get(0), revision.getGroup());
        
        // Remove a run to create a deletion-type revision.
        doc.getFirstSection().getBody().getFirstParagraph().getRuns().get(0).remove();
        
        // Adding a new revision places it at the beginning of the revision collection.
        Assert.assertEquals(RevisionType.DELETION, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(2, doc.getRevisions().getCount());
        
        // Insert revisions show up in the document body even before we accept/reject the revision.
        // Rejecting the revision will remove its nodes from the body. Conversely, nodes that make up delete revisions
        // also linger in the document until we accept the revision.
        Assert.assertEquals("This does not count as a revision. This is revision #1.", doc.getText().trim());
        
        // Accepting the delete revision will remove its parent node from the paragraph text
        // and then remove the collection's revision itself.
        doc.getRevisions().get(0).accept();
        
        Assert.assertEquals(1, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1.", doc.getText().trim());
        
        builder.writeln("");
        builder.write("This is revision #2.");
        
        // Now move the node to create a moving revision type.
        Node node = doc.getFirstSection().getBody().getParagraphs().get(1);
        Node endNode = doc.getFirstSection().getBody().getParagraphs().get(1).getNextSibling();
        Node referenceNode = doc.getFirstSection().getBody().getParagraphs().get(0);
        
        while (node != endNode)
        {
            Node nextNode = node.getNextSibling();
            doc.getFirstSection().getBody().insertBefore(node, referenceNode);
            node = nextNode;
        }
        
        Assert.assertEquals(RevisionType.MOVING, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(8, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #2.\rThis is revision #1. \rThis is revision #2.", doc.getText().trim());
        
        // The moving revision is now at index 1. Reject the revision to discard its contents.
        doc.getRevisions().get(1).reject();
        
        Assert.assertEquals(6, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1. \rThis is revision #2.", doc.getText().trim());
      • getDateTime/setDateTime

        public java.util.Date getDateTime() / public void setDateTime(java.util.Date value)
        
        Gets or sets the date/time of this revision.

        Example:

        Shows how to work with revisions in a document.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        // Normal editing of the document does not count as a revision.
        builder.write("This does not count as a revision. ");
        
        Assert.assertFalse(doc.hasRevisions());
        
        // To register our edits as revisions, we need to declare an author, and then start tracking them.
        doc.startTrackRevisions("John Doe", new Date());
        
        builder.write("This is revision #1. ");
        
        Assert.assertTrue(doc.hasRevisions());
        Assert.assertEquals(1, doc.getRevisions().getCount());
        
        // This flag corresponds to the "Review" -> "Tracking" -> "Track Changes" option in Microsoft Word.
        // The "StartTrackRevisions" method does not affect its value,
        // and the document is tracking revisions programmatically despite it having a value of "false".
        // If we open this document using Microsoft Word, it will not be tracking revisions.
        Assert.assertFalse(doc.getTrackRevisions());
        
        // We have added text using the document builder, so the first revision is an insertion-type revision.
        Revision revision = doc.getRevisions().get(0);
        Assert.assertEquals("John Doe", revision.getAuthor());
        Assert.assertEquals("This is revision #1. ", revision.getParentNode().getText());
        Assert.assertEquals(RevisionType.INSERTION, revision.getRevisionType());
        Assert.assertEquals(revision.getDateTime().getDate(), new Date().getDate());
        Assert.assertEquals(doc.getRevisions().getGroups().get(0), revision.getGroup());
        
        // Remove a run to create a deletion-type revision.
        doc.getFirstSection().getBody().getFirstParagraph().getRuns().get(0).remove();
        
        // Adding a new revision places it at the beginning of the revision collection.
        Assert.assertEquals(RevisionType.DELETION, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(2, doc.getRevisions().getCount());
        
        // Insert revisions show up in the document body even before we accept/reject the revision.
        // Rejecting the revision will remove its nodes from the body. Conversely, nodes that make up delete revisions
        // also linger in the document until we accept the revision.
        Assert.assertEquals("This does not count as a revision. This is revision #1.", doc.getText().trim());
        
        // Accepting the delete revision will remove its parent node from the paragraph text
        // and then remove the collection's revision itself.
        doc.getRevisions().get(0).accept();
        
        Assert.assertEquals(1, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1.", doc.getText().trim());
        
        builder.writeln("");
        builder.write("This is revision #2.");
        
        // Now move the node to create a moving revision type.
        Node node = doc.getFirstSection().getBody().getParagraphs().get(1);
        Node endNode = doc.getFirstSection().getBody().getParagraphs().get(1).getNextSibling();
        Node referenceNode = doc.getFirstSection().getBody().getParagraphs().get(0);
        
        while (node != endNode)
        {
            Node nextNode = node.getNextSibling();
            doc.getFirstSection().getBody().insertBefore(node, referenceNode);
            node = nextNode;
        }
        
        Assert.assertEquals(RevisionType.MOVING, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(8, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #2.\rThis is revision #1. \rThis is revision #2.", doc.getText().trim());
        
        // The moving revision is now at index 1. Reject the revision to discard its contents.
        doc.getRevisions().get(1).reject();
        
        Assert.assertEquals(6, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1. \rThis is revision #2.", doc.getText().trim());
      • getGroup

        public RevisionGroup getGroup()
        
        Gets the revision group. Returns null if the revision does not belong to any group. Revision has no group if revision type is RevisionType.StyleDefinitionChange or if the revision is not longer exist in document context (accepted/rejected).

        Example:

        Shows how to work with revisions in a document.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        // Normal editing of the document does not count as a revision.
        builder.write("This does not count as a revision. ");
        
        Assert.assertFalse(doc.hasRevisions());
        
        // To register our edits as revisions, we need to declare an author, and then start tracking them.
        doc.startTrackRevisions("John Doe", new Date());
        
        builder.write("This is revision #1. ");
        
        Assert.assertTrue(doc.hasRevisions());
        Assert.assertEquals(1, doc.getRevisions().getCount());
        
        // This flag corresponds to the "Review" -> "Tracking" -> "Track Changes" option in Microsoft Word.
        // The "StartTrackRevisions" method does not affect its value,
        // and the document is tracking revisions programmatically despite it having a value of "false".
        // If we open this document using Microsoft Word, it will not be tracking revisions.
        Assert.assertFalse(doc.getTrackRevisions());
        
        // We have added text using the document builder, so the first revision is an insertion-type revision.
        Revision revision = doc.getRevisions().get(0);
        Assert.assertEquals("John Doe", revision.getAuthor());
        Assert.assertEquals("This is revision #1. ", revision.getParentNode().getText());
        Assert.assertEquals(RevisionType.INSERTION, revision.getRevisionType());
        Assert.assertEquals(revision.getDateTime().getDate(), new Date().getDate());
        Assert.assertEquals(doc.getRevisions().getGroups().get(0), revision.getGroup());
        
        // Remove a run to create a deletion-type revision.
        doc.getFirstSection().getBody().getFirstParagraph().getRuns().get(0).remove();
        
        // Adding a new revision places it at the beginning of the revision collection.
        Assert.assertEquals(RevisionType.DELETION, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(2, doc.getRevisions().getCount());
        
        // Insert revisions show up in the document body even before we accept/reject the revision.
        // Rejecting the revision will remove its nodes from the body. Conversely, nodes that make up delete revisions
        // also linger in the document until we accept the revision.
        Assert.assertEquals("This does not count as a revision. This is revision #1.", doc.getText().trim());
        
        // Accepting the delete revision will remove its parent node from the paragraph text
        // and then remove the collection's revision itself.
        doc.getRevisions().get(0).accept();
        
        Assert.assertEquals(1, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1.", doc.getText().trim());
        
        builder.writeln("");
        builder.write("This is revision #2.");
        
        // Now move the node to create a moving revision type.
        Node node = doc.getFirstSection().getBody().getParagraphs().get(1);
        Node endNode = doc.getFirstSection().getBody().getParagraphs().get(1).getNextSibling();
        Node referenceNode = doc.getFirstSection().getBody().getParagraphs().get(0);
        
        while (node != endNode)
        {
            Node nextNode = node.getNextSibling();
            doc.getFirstSection().getBody().insertBefore(node, referenceNode);
            node = nextNode;
        }
        
        Assert.assertEquals(RevisionType.MOVING, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(8, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #2.\rThis is revision #1. \rThis is revision #2.", doc.getText().trim());
        
        // The moving revision is now at index 1. Reject the revision to discard its contents.
        doc.getRevisions().get(1).reject();
        
        Assert.assertEquals(6, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1. \rThis is revision #2.", doc.getText().trim());
      • getParentNode

        public Node getParentNode()
        
        Gets the immediate parent node (owner) of this revision. This property will work for any revision type other than RevisionType.STYLE_DEFINITION_CHANGE. If this revision relates to change of Style formatting, use ParentStyle instead.

        Example:

        Shows how to determine the revision type of an inline node.
        Document doc = new Document(getMyDir() + "Revision runs.docx");
        
        // When we edit the document while the "Track Changes" option, found in via Review -> Tracking,
        // is turned on in Microsoft Word, the changes we apply count as revisions.
        // When editing a document using Aspose.Words, we can begin tracking revisions by
        // invoking the document's "StartTrackRevisions" method and stop tracking by using the "StopTrackRevisions" method.
        // We can either accept revisions to assimilate them into the document
        // or reject them to change the proposed change effectively.
        Assert.assertEquals(6, doc.getRevisions().getCount());
        
        // The parent node of a revision is the run that the revision concerns. A Run is an Inline node.
        Run run = (Run) doc.getRevisions().get(0).getParentNode();
        
        Paragraph firstParagraph = run.getParentParagraph();
        RunCollection runs = firstParagraph.getRuns();
        
        Assert.assertEquals(runs.getCount(), 6);
        
        // Below are five types of revisions that can flag an Inline node.
        // 1 -  An "insert" revision:
        // This revision occurs when we insert text while tracking changes.
        Assert.assertTrue(runs.get(2).isInsertRevision());
        
        // 2 -  A "format" revision:
        // This revision occurs when we change the formatting of text while tracking changes.
        Assert.assertTrue(runs.get(2).isFormatRevision());
        
        // 3 -  A "move from" revision:
        // When we highlight text in Microsoft Word, and then drag it to a different place in the document
        // while tracking changes, two revisions appear.
        // The "move from" revision is a copy of the text originally before we moved it.
        Assert.assertTrue(runs.get(4).isMoveFromRevision());
        
        // 4 -  A "move to" revision:
        // The "move to" revision is the text that we moved in its new position in the document.
        // "Move from" and "move to" revisions appear in pairs for every move revision we carry out.
        // Accepting a move revision deletes the "move from" revision and its text,
        // and keeps the text from the "move to" revision.
        // Rejecting a move revision conversely keeps the "move from" revision and deletes the "move to" revision.
        Assert.assertTrue(runs.get(1).isMoveToRevision());
        
        // 5 -  A "delete" revision:
        // This revision occurs when we delete text while tracking changes. When we delete text like this,
        // it will stay in the document as a revision until we either accept the revision,
        // which will delete the text for good, or reject the revision, which will keep the text we deleted where it was.
        Assert.assertTrue(runs.get(5).isDeleteRevision());
      • getParentStyle

        public Style getParentStyle()
        
        Gets the immediate parent style (owner) of this revision. This property will work for only for the RevisionType.STYLE_DEFINITION_CHANGE revision type. If this revision relates to changes on document nodes, use ParentNode instead.

        Example:

        Shows how to work with a document's collection of revisions.
        Document doc = new Document(getMyDir() + "Revisions.docx");
        RevisionCollection revisions = doc.getRevisions();
        
        // This collection itself has a collection of revision groups.
        // Each group is a sequence of adjacent revisions.
        System.out.println(MessageFormat.format("{0} revision groups:", revisions.getGroups().getCount()));
        
        // Iterate over the collection of groups and print the text that the revision concerns.
        Iterator<RevisionGroup> e = revisions.getGroups().iterator();
        
        while (e.hasNext()) {
            RevisionGroup revisionGroup = e.next();
        
            System.out.println(MessageFormat.format("\tGroup type \"{0}\", ", revisionGroup.getRevisionType()) +
                    MessageFormat.format("author: {0}, contents: [{1}]", revisionGroup.getAuthor(), revisionGroup.getText().trim()));
        }
        
        // Each Run that a revision affects gets a corresponding Revision object.
        // The revisions' collection is considerably larger than the condensed form we printed above,
        // depending on how many Runs we have segmented the document into during Microsoft Word editing.
        System.out.println("\n{revisions.Count} revisions:");
        
        Iterator<Revision> e1 = revisions.iterator();
        
        while (e1.hasNext()) {
            Revision revision = e1.next();
        
            // A StyleDefinitionChange strictly affects styles and not document nodes. This means the "ParentStyle"
            // property will always be in use, while the ParentNode will always be null.
            // Since all other changes affect nodes, ParentNode will conversely be in use, and ParentStyle will be null.
            if (revision.getRevisionType() == RevisionType.STYLE_DEFINITION_CHANGE) {
                System.out.println(MessageFormat.format("\tRevision type \"{0}\", ", revision.getRevisionType()) +
                        MessageFormat.format("author: {0}, style: [{1}]", revision.getAuthor(), revision.getParentStyle().getName()));
            } else {
                System.out.println(MessageFormat.format("\tRevision type \"{0}\", ", revision.getRevisionType()) +
                        MessageFormat.format("author: {0}, contents: [{1}]", revision.getAuthor(), revision.getParentNode().getText().trim()));
            }
        }
        
        // Reject all revisions via the collection, reverting the document to its original form.
        revisions.rejectAll();
        
        Assert.assertEquals(0, revisions.getCount());
      • getRevisionType

        public int getRevisionType()
        
        Gets the type of this revision. The value of the property is RevisionType integer constant.

        Example:

        Shows how to work with revisions in a document.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        // Normal editing of the document does not count as a revision.
        builder.write("This does not count as a revision. ");
        
        Assert.assertFalse(doc.hasRevisions());
        
        // To register our edits as revisions, we need to declare an author, and then start tracking them.
        doc.startTrackRevisions("John Doe", new Date());
        
        builder.write("This is revision #1. ");
        
        Assert.assertTrue(doc.hasRevisions());
        Assert.assertEquals(1, doc.getRevisions().getCount());
        
        // This flag corresponds to the "Review" -> "Tracking" -> "Track Changes" option in Microsoft Word.
        // The "StartTrackRevisions" method does not affect its value,
        // and the document is tracking revisions programmatically despite it having a value of "false".
        // If we open this document using Microsoft Word, it will not be tracking revisions.
        Assert.assertFalse(doc.getTrackRevisions());
        
        // We have added text using the document builder, so the first revision is an insertion-type revision.
        Revision revision = doc.getRevisions().get(0);
        Assert.assertEquals("John Doe", revision.getAuthor());
        Assert.assertEquals("This is revision #1. ", revision.getParentNode().getText());
        Assert.assertEquals(RevisionType.INSERTION, revision.getRevisionType());
        Assert.assertEquals(revision.getDateTime().getDate(), new Date().getDate());
        Assert.assertEquals(doc.getRevisions().getGroups().get(0), revision.getGroup());
        
        // Remove a run to create a deletion-type revision.
        doc.getFirstSection().getBody().getFirstParagraph().getRuns().get(0).remove();
        
        // Adding a new revision places it at the beginning of the revision collection.
        Assert.assertEquals(RevisionType.DELETION, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(2, doc.getRevisions().getCount());
        
        // Insert revisions show up in the document body even before we accept/reject the revision.
        // Rejecting the revision will remove its nodes from the body. Conversely, nodes that make up delete revisions
        // also linger in the document until we accept the revision.
        Assert.assertEquals("This does not count as a revision. This is revision #1.", doc.getText().trim());
        
        // Accepting the delete revision will remove its parent node from the paragraph text
        // and then remove the collection's revision itself.
        doc.getRevisions().get(0).accept();
        
        Assert.assertEquals(1, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1.", doc.getText().trim());
        
        builder.writeln("");
        builder.write("This is revision #2.");
        
        // Now move the node to create a moving revision type.
        Node node = doc.getFirstSection().getBody().getParagraphs().get(1);
        Node endNode = doc.getFirstSection().getBody().getParagraphs().get(1).getNextSibling();
        Node referenceNode = doc.getFirstSection().getBody().getParagraphs().get(0);
        
        while (node != endNode)
        {
            Node nextNode = node.getNextSibling();
            doc.getFirstSection().getBody().insertBefore(node, referenceNode);
            node = nextNode;
        }
        
        Assert.assertEquals(RevisionType.MOVING, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(8, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #2.\rThis is revision #1. \rThis is revision #2.", doc.getText().trim());
        
        // The moving revision is now at index 1. Reject the revision to discard its contents.
        doc.getRevisions().get(1).reject();
        
        Assert.assertEquals(6, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1. \rThis is revision #2.", doc.getText().trim());
    • Method Detail

      • accept

        public void accept()
                   throws java.lang.Exception
        Accepts this revision.

        Example:

        Shows how to work with revisions in a document.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        // Normal editing of the document does not count as a revision.
        builder.write("This does not count as a revision. ");
        
        Assert.assertFalse(doc.hasRevisions());
        
        // To register our edits as revisions, we need to declare an author, and then start tracking them.
        doc.startTrackRevisions("John Doe", new Date());
        
        builder.write("This is revision #1. ");
        
        Assert.assertTrue(doc.hasRevisions());
        Assert.assertEquals(1, doc.getRevisions().getCount());
        
        // This flag corresponds to the "Review" -> "Tracking" -> "Track Changes" option in Microsoft Word.
        // The "StartTrackRevisions" method does not affect its value,
        // and the document is tracking revisions programmatically despite it having a value of "false".
        // If we open this document using Microsoft Word, it will not be tracking revisions.
        Assert.assertFalse(doc.getTrackRevisions());
        
        // We have added text using the document builder, so the first revision is an insertion-type revision.
        Revision revision = doc.getRevisions().get(0);
        Assert.assertEquals("John Doe", revision.getAuthor());
        Assert.assertEquals("This is revision #1. ", revision.getParentNode().getText());
        Assert.assertEquals(RevisionType.INSERTION, revision.getRevisionType());
        Assert.assertEquals(revision.getDateTime().getDate(), new Date().getDate());
        Assert.assertEquals(doc.getRevisions().getGroups().get(0), revision.getGroup());
        
        // Remove a run to create a deletion-type revision.
        doc.getFirstSection().getBody().getFirstParagraph().getRuns().get(0).remove();
        
        // Adding a new revision places it at the beginning of the revision collection.
        Assert.assertEquals(RevisionType.DELETION, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(2, doc.getRevisions().getCount());
        
        // Insert revisions show up in the document body even before we accept/reject the revision.
        // Rejecting the revision will remove its nodes from the body. Conversely, nodes that make up delete revisions
        // also linger in the document until we accept the revision.
        Assert.assertEquals("This does not count as a revision. This is revision #1.", doc.getText().trim());
        
        // Accepting the delete revision will remove its parent node from the paragraph text
        // and then remove the collection's revision itself.
        doc.getRevisions().get(0).accept();
        
        Assert.assertEquals(1, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1.", doc.getText().trim());
        
        builder.writeln("");
        builder.write("This is revision #2.");
        
        // Now move the node to create a moving revision type.
        Node node = doc.getFirstSection().getBody().getParagraphs().get(1);
        Node endNode = doc.getFirstSection().getBody().getParagraphs().get(1).getNextSibling();
        Node referenceNode = doc.getFirstSection().getBody().getParagraphs().get(0);
        
        while (node != endNode)
        {
            Node nextNode = node.getNextSibling();
            doc.getFirstSection().getBody().insertBefore(node, referenceNode);
            node = nextNode;
        }
        
        Assert.assertEquals(RevisionType.MOVING, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(8, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #2.\rThis is revision #1. \rThis is revision #2.", doc.getText().trim());
        
        // The moving revision is now at index 1. Reject the revision to discard its contents.
        doc.getRevisions().get(1).reject();
        
        Assert.assertEquals(6, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1. \rThis is revision #2.", doc.getText().trim());
      • reject

        public void reject()
                   throws java.lang.Exception
        Reject this revision.

        Example:

        Shows how to work with revisions in a document.
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        
        // Normal editing of the document does not count as a revision.
        builder.write("This does not count as a revision. ");
        
        Assert.assertFalse(doc.hasRevisions());
        
        // To register our edits as revisions, we need to declare an author, and then start tracking them.
        doc.startTrackRevisions("John Doe", new Date());
        
        builder.write("This is revision #1. ");
        
        Assert.assertTrue(doc.hasRevisions());
        Assert.assertEquals(1, doc.getRevisions().getCount());
        
        // This flag corresponds to the "Review" -> "Tracking" -> "Track Changes" option in Microsoft Word.
        // The "StartTrackRevisions" method does not affect its value,
        // and the document is tracking revisions programmatically despite it having a value of "false".
        // If we open this document using Microsoft Word, it will not be tracking revisions.
        Assert.assertFalse(doc.getTrackRevisions());
        
        // We have added text using the document builder, so the first revision is an insertion-type revision.
        Revision revision = doc.getRevisions().get(0);
        Assert.assertEquals("John Doe", revision.getAuthor());
        Assert.assertEquals("This is revision #1. ", revision.getParentNode().getText());
        Assert.assertEquals(RevisionType.INSERTION, revision.getRevisionType());
        Assert.assertEquals(revision.getDateTime().getDate(), new Date().getDate());
        Assert.assertEquals(doc.getRevisions().getGroups().get(0), revision.getGroup());
        
        // Remove a run to create a deletion-type revision.
        doc.getFirstSection().getBody().getFirstParagraph().getRuns().get(0).remove();
        
        // Adding a new revision places it at the beginning of the revision collection.
        Assert.assertEquals(RevisionType.DELETION, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(2, doc.getRevisions().getCount());
        
        // Insert revisions show up in the document body even before we accept/reject the revision.
        // Rejecting the revision will remove its nodes from the body. Conversely, nodes that make up delete revisions
        // also linger in the document until we accept the revision.
        Assert.assertEquals("This does not count as a revision. This is revision #1.", doc.getText().trim());
        
        // Accepting the delete revision will remove its parent node from the paragraph text
        // and then remove the collection's revision itself.
        doc.getRevisions().get(0).accept();
        
        Assert.assertEquals(1, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1.", doc.getText().trim());
        
        builder.writeln("");
        builder.write("This is revision #2.");
        
        // Now move the node to create a moving revision type.
        Node node = doc.getFirstSection().getBody().getParagraphs().get(1);
        Node endNode = doc.getFirstSection().getBody().getParagraphs().get(1).getNextSibling();
        Node referenceNode = doc.getFirstSection().getBody().getParagraphs().get(0);
        
        while (node != endNode)
        {
            Node nextNode = node.getNextSibling();
            doc.getFirstSection().getBody().insertBefore(node, referenceNode);
            node = nextNode;
        }
        
        Assert.assertEquals(RevisionType.MOVING, doc.getRevisions().get(0).getRevisionType());
        Assert.assertEquals(8, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #2.\rThis is revision #1. \rThis is revision #2.", doc.getText().trim());
        
        // The moving revision is now at index 1. Reject the revision to discard its contents.
        doc.getRevisions().get(1).reject();
        
        Assert.assertEquals(6, doc.getRevisions().getCount());
        Assert.assertEquals("This is revision #1. \rThis is revision #2.", doc.getText().trim());