diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
index 65952cbae..5badf3a67 100644
--- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
+++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
@@ -1157,6 +1157,24 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
settings.setUpdateFields();
}
+ /**
+ * Check if revision tracking is turned on.
+ *
+ * @return true
if revision tracking is turned on
+ */
+ public boolean isTrackRevisions() {
+ return settings.isTrackRevisions();
+ }
+
+ /**
+ * Enable or disable revision tracking.
+ *
+ * @param true
to turn on revision tracking, false
to turn off revision tracking
+ */
+ public void setTrackRevisions(boolean enable) {
+ settings.setTrackRevisions(enable);
+ }
+
/**
* inserts an existing XWPFTable to the arrays bodyElements and tables
* @param pos
diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSettings.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSettings.java
index dab349a27..43041bb0c 100644
--- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSettings.java
+++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSettings.java
@@ -326,6 +326,32 @@ public class XWPFSettings extends POIXMLDocumentPart {
return ctSettings.isSetUpdateFields() && ctSettings.getUpdateFields().getVal() == STOnOff.TRUE;
}
+ /**
+ * Check if revision tracking is turned on.
+ *
+ * @return true
if revision tracking is turned on
+ */
+ public boolean isTrackRevisions() {
+ return ctSettings.isSetTrackRevisions();
+ }
+
+ /**
+ * Enable or disable revision tracking.
+ *
+ * @param true
to turn on revision tracking, false
to turn off revision tracking
+ */
+ public void setTrackRevisions(boolean enable) {
+ if(enable) {
+ if(!ctSettings.isSetTrackRevisions()) {
+ ctSettings.addNewTrackRevisions();
+ }
+ } else {
+ if(ctSettings.isSetTrackRevisions()) {
+ ctSettings.unsetTrackRevisions();
+ }
+ }
+ }
+
@Override
protected void commit() throws IOException {
if (ctSettings == null) {
diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestChangeTracking.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestChangeTracking.java
new file mode 100644
index 000000000..d3e4758e1
--- /dev/null
+++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestChangeTracking.java
@@ -0,0 +1,71 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+package org.apache.poi.xwpf.usermodel;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import org.apache.poi.xwpf.XWPFTestDataSamples;
+import org.junit.Test;
+
+public class TestChangeTracking {
+
+ @Test
+ public void detection() throws Exception {
+
+ XWPFDocument documentWithoutChangeTracking = XWPFTestDataSamples.openSampleDocument("bug56075-changeTracking_off.docx");
+ assertFalse(documentWithoutChangeTracking.isTrackRevisions());
+
+ XWPFDocument documentWithChangeTracking = XWPFTestDataSamples.openSampleDocument("bug56075-changeTracking_on.docx");
+ assertTrue(documentWithChangeTracking.isTrackRevisions());
+
+ }
+
+ @Test
+ public void activateChangeTracking() throws Exception {
+ XWPFDocument document = XWPFTestDataSamples.openSampleDocument("bug56075-changeTracking_off.docx");
+ assertFalse(document.isTrackRevisions());
+
+ document.setTrackRevisions(true);
+
+ assertTrue(document.isTrackRevisions());
+ }
+
+ @Test
+ public void integration() throws Exception {
+ XWPFDocument doc = new XWPFDocument();
+
+ XWPFParagraph p1 = doc.createParagraph();
+
+ XWPFRun r1 = p1.createRun();
+ r1.setText("Lorem ipsum dolor sit amet.");
+ doc.setTrackRevisions(true);
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ doc.write(out);
+
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(out.toByteArray());
+ XWPFDocument document = new XWPFDocument(inputStream);
+ inputStream.close();
+
+ assertTrue(document.isTrackRevisions());
+ }
+
+}
diff --git a/test-data/document/bug56075-changeTracking_off.docx b/test-data/document/bug56075-changeTracking_off.docx
new file mode 100644
index 000000000..a92202d22
Binary files /dev/null and b/test-data/document/bug56075-changeTracking_off.docx differ
diff --git a/test-data/document/bug56075-changeTracking_on.docx b/test-data/document/bug56075-changeTracking_on.docx
new file mode 100644
index 000000000..401af507f
Binary files /dev/null and b/test-data/document/bug56075-changeTracking_on.docx differ