[47942] added implementation of protection features to XLSX and DOCX files. Patch submitted by Roberto Albertini.
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@830657 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
3cd055080c
commit
1d82206713
@ -28,11 +28,13 @@
|
||||
<person id="NB" name="Nick Burch" email="nick@torchbox.com"/>
|
||||
<person id="POI-DEVELOPERS" name="POI Developers" email="dev@poi.apache.org"/>
|
||||
<person id="RK" name="Rainer Klute" email="klute@apache.org"/>
|
||||
<person id="UC" name="Ugo Cei" email="ugo@apache.org"/>
|
||||
<person id="YK" name="Yegor Kozlov" email="yegor@apache.org"/>
|
||||
</developers>
|
||||
|
||||
<changes>
|
||||
<release version="3.6-beta1" date="2009-??-??">
|
||||
<action dev="POI-DEVELOPERS" type="add">47942 - added implementation of protection features to XLSX and DOCX files</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">48070 - preserve leading and trailing white spaces in XSSFRichTextString</action>
|
||||
<action dev="POI-DEVELOPERS" type="add">48044 - added implementation for CountBlank function</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">48036 - added IntersectionEval to allow evaluation of the intersection formula operator</action>
|
||||
|
@ -78,6 +78,7 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetData;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetFormatPr;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetPr;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetProtection;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetView;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetViews;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
|
||||
@ -857,7 +858,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
||||
* @return true => protection enabled; false => protection disabled
|
||||
*/
|
||||
public boolean getProtect() {
|
||||
return worksheet.isSetSheetProtection() && worksheet.getSheetProtection().getSheet();
|
||||
return worksheet.isSetSheetProtection() && sheetProtectionEnabled();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2332,4 +2333,308 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
||||
|
||||
worksheet.save(out, xmlOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Autofilters are locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isAutoFilterLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getAutoFilter();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Deleting columns is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isDeleteColumnsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getDeleteColumns();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Deleting rows is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isDeleteRowsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getDeleteRows();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Formatting cells is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isFormatCellsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getFormatCells();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Formatting columns is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isFormatColumnsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getFormatColumns();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Formatting rows is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isFormatRowsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getFormatRows();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Inserting columns is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isInsertColumnsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getInsertColumns();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Inserting hyperlinks is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isInsertHyperlinksLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getInsertHyperlinks();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Inserting rows is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isInsertRowsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getInsertRows();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Pivot tables are locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isPivotTablesLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getPivotTables();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Sorting is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isSortLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getSort();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Objects are locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isObjectsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getObjects();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Scenarios are locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isScenariosLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getScenarios();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Selection of locked cells is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isSelectLockedCellsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getSelectLockedCells();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Selection of unlocked cells is locked and the sheet is protected.
|
||||
*/
|
||||
public boolean isSelectUnlockedCellsLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getSelectUnlockedCells();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true when Sheet is Protected.
|
||||
*/
|
||||
public boolean isSheetLocked() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
return sheetProtectionEnabled() && worksheet.getSheetProtection().getSheet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable sheet protection
|
||||
*/
|
||||
public void enableLocking() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setSheet(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable sheet protection
|
||||
*/
|
||||
public void disableLocking() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setSheet(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Autofilters locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockAutoFilter() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setAutoFilter(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Deleting columns locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockDeleteColumns() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setDeleteColumns(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Deleting rows locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockDeleteRows() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setDeleteRows(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Formatting cells locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockFormatCells() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setDeleteColumns(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Formatting columns locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockFormatColumns() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setFormatColumns(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Formatting rows locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockFormatRows() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setFormatRows(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Inserting columns locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockInsertColumns() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setInsertColumns(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Inserting hyperlinks locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockInsertHyperlinks() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setInsertHyperlinks(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Inserting rows locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockInsertRows() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setInsertRows(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Pivot Tables locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockPivotTables() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setPivotTables(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Sort locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockSort() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setSort(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Objects locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockObjects() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setObjects(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Scenarios locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockScenarios() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setScenarios(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Selection of locked cells locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockSelectLockedCells() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setSelectLockedCells(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Selection of unlocked cells locking.
|
||||
* This does not modify sheet protection status.
|
||||
* To enforce this locking, call {@link #enableLocking()}
|
||||
*/
|
||||
public void lockSelectUnlockedCells() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
worksheet.getSheetProtection().setSelectUnlockedCells(true);
|
||||
}
|
||||
|
||||
private void createProtectionFieldIfNotPresent() {
|
||||
if (worksheet.getSheetProtection() == null) {
|
||||
worksheet.setSheetProtection(CTSheetProtection.Factory.newInstance());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean sheetProtectionEnabled() {
|
||||
return worksheet.getSheetProtection().getSheet();
|
||||
}
|
||||
}
|
||||
|
@ -1345,4 +1345,96 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
||||
public MapInfo getMapInfo(){
|
||||
return mapInfo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Specifies a boolean value that indicates whether structure of workbook is locked. <br/>
|
||||
* A value true indicates the structure of the workbook is locked. Worksheets in the workbook can't be moved,
|
||||
* deleted, hidden, unhidden, or renamed, and new worksheets can't be inserted.<br/>
|
||||
* A value of false indicates the structure of the workbook is not locked.<br/>
|
||||
*
|
||||
* @return true if structure of workbook is locked
|
||||
*/
|
||||
public boolean isStructureLocked() {
|
||||
return workbookProtectionPresent() && workbook.getWorkbookProtection().getLockStructure();
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies a boolean value that indicates whether the windows that comprise the workbook are locked. <br/>
|
||||
* A value of true indicates the workbook windows are locked. Windows are the same size and position each time the
|
||||
* workbook is opened.<br/>
|
||||
* A value of false indicates the workbook windows are not locked.
|
||||
*
|
||||
* @return true if windows that comprise the workbook are locked
|
||||
*/
|
||||
public boolean isWindowsLocked() {
|
||||
return workbookProtectionPresent() && workbook.getWorkbookProtection().getLockWindows();
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies a boolean value that indicates whether the workbook is locked for revisions.
|
||||
*
|
||||
* @return true if the workbook is locked for revisions.
|
||||
*/
|
||||
public boolean isRevisionLocked() {
|
||||
return workbookProtectionPresent() && workbook.getWorkbookProtection().getLockRevision();
|
||||
}
|
||||
|
||||
/**
|
||||
* Locks the structure of workbook.
|
||||
*/
|
||||
public void lockStructure() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
workbook.getWorkbookProtection().setLockStructure(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlocks the structure of workbook.
|
||||
*/
|
||||
public void unLockStructure() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
workbook.getWorkbookProtection().setLockStructure(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Locks the windows that comprise the workbook.
|
||||
*/
|
||||
public void lockWindows() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
workbook.getWorkbookProtection().setLockWindows(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlocks the windows that comprise the workbook.
|
||||
*/
|
||||
public void unLockWindows() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
workbook.getWorkbookProtection().setLockWindows(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Locks the workbook for revisions.
|
||||
*/
|
||||
public void lockRevision() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
workbook.getWorkbookProtection().setLockRevision(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlocks the workbook for revisions.
|
||||
*/
|
||||
public void unLockRevision() {
|
||||
createProtectionFieldIfNotPresent();
|
||||
workbook.getWorkbookProtection().setLockRevision(false);
|
||||
}
|
||||
|
||||
private boolean workbookProtectionPresent() {
|
||||
return workbook.getWorkbookProtection() != null;
|
||||
}
|
||||
|
||||
private void createProtectionFieldIfNotPresent() {
|
||||
if (workbook.getWorkbookProtection() == null){
|
||||
workbook.setWorkbookProtection(CTWorkbookProtection.Factory.newInstance());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,6 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
||||
import org.apache.poi.openxml4j.opc.*;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
/**
|
||||
@ -50,6 +49,7 @@ import javax.xml.namespace.QName;
|
||||
public class XWPFDocument extends POIXMLDocument {
|
||||
|
||||
private CTDocument1 ctDocument;
|
||||
private XWPFSettings settings;
|
||||
protected List<XWPFComment> comments;
|
||||
protected List<XWPFHyperlink> hyperlinks;
|
||||
protected List<XWPFParagraph> paragraphs;
|
||||
@ -107,6 +107,7 @@ public class XWPFDocument extends POIXMLDocument {
|
||||
}
|
||||
|
||||
// Sort out headers and footers
|
||||
if (doc.getDocument().getBody().getSectPr() != null)
|
||||
headerFooterPolicy = new XWPFHeaderFooterPolicy(this);
|
||||
|
||||
for(POIXMLDocumentPart p : getRelations()){
|
||||
@ -117,6 +118,9 @@ public class XWPFDocument extends POIXMLDocument {
|
||||
comments.add(new XWPFComment(ctcomment));
|
||||
}
|
||||
}
|
||||
else if(relation.equals(XWPFRelation.SETTINGS.getRelation())){
|
||||
settings = (XWPFSettings)p;
|
||||
}
|
||||
}
|
||||
|
||||
initHyperlinks();
|
||||
@ -192,6 +196,8 @@ public class XWPFDocument extends POIXMLDocument {
|
||||
ctDocument = CTDocument1.Factory.newInstance();
|
||||
ctDocument.addNewBody();
|
||||
|
||||
settings = (XWPFSettings) createRelationship(XWPFRelation.SETTINGS, XWPFFactory.getInstance());
|
||||
|
||||
POIXMLProperties.ExtendedProperties expProps = getProperties().getExtendedProperties();
|
||||
expProps.getUnderlyingProperties().setApplication(DOCUMENT_CREATOR);
|
||||
}
|
||||
@ -390,4 +396,146 @@ public class XWPFDocument extends POIXMLDocument {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that the documentProtection tag in settings.xml file <br/>
|
||||
* specifies that the protection is enforced (w:enforcement="1") <br/>
|
||||
* and that the kind of protection is readOnly (w:edit="readOnly")<br/>
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="readOnly" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*
|
||||
* @return true if documentProtection is enforced with option readOnly
|
||||
*/
|
||||
public boolean isEnforcedReadonlyProtection() {
|
||||
return settings.isEnforcedWith(STDocProtect.READ_ONLY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that the documentProtection tag in settings.xml file <br/>
|
||||
* specifies that the protection is enforced (w:enforcement="1") <br/>
|
||||
* and that the kind of protection is forms (w:edit="forms")<br/>
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="forms" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*
|
||||
* @return true if documentProtection is enforced with option forms
|
||||
*/
|
||||
public boolean isEnforcedFillingFormsProtection() {
|
||||
return settings.isEnforcedWith(STDocProtect.FORMS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that the documentProtection tag in settings.xml file <br/>
|
||||
* specifies that the protection is enforced (w:enforcement="1") <br/>
|
||||
* and that the kind of protection is comments (w:edit="comments")<br/>
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="comments" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*
|
||||
* @return true if documentProtection is enforced with option comments
|
||||
*/
|
||||
public boolean isEnforcedCommentsProtection() {
|
||||
return settings.isEnforcedWith(STDocProtect.COMMENTS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that the documentProtection tag in settings.xml file <br/>
|
||||
* specifies that the protection is enforced (w:enforcement="1") <br/>
|
||||
* and that the kind of protection is trackedChanges (w:edit="trackedChanges")<br/>
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="trackedChanges" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*
|
||||
* @return true if documentProtection is enforced with option trackedChanges
|
||||
*/
|
||||
public boolean isEnforcedTrackedChangesProtection() {
|
||||
return settings.isEnforcedWith(STDocProtect.TRACKED_CHANGES);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enforces the readOnly protection.<br/>
|
||||
* In the documentProtection tag inside settings.xml file, <br/>
|
||||
* it sets the value of enforcement to "1" (w:enforcement="1") <br/>
|
||||
* and the value of edit to readOnly (w:edit="readOnly")<br/>
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="readOnly" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*/
|
||||
public void enforceReadonlyProtection() {
|
||||
settings.setEnforcementEditValue(STDocProtect.READ_ONLY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enforce the Filling Forms protection.<br/>
|
||||
* In the documentProtection tag inside settings.xml file, <br/>
|
||||
* it sets the value of enforcement to "1" (w:enforcement="1") <br/>
|
||||
* and the value of edit to forms (w:edit="forms")<br/>
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="forms" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*/
|
||||
public void enforceFillingFormsProtection() {
|
||||
settings.setEnforcementEditValue(STDocProtect.FORMS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enforce the Comments protection.<br/>
|
||||
* In the documentProtection tag inside settings.xml file,<br/>
|
||||
* it sets the value of enforcement to "1" (w:enforcement="1") <br/>
|
||||
* and the value of edit to comments (w:edit="comments")<br/>
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="comments" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*/
|
||||
public void enforceCommentsProtection() {
|
||||
settings.setEnforcementEditValue(STDocProtect.COMMENTS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enforce the Tracked Changes protection.<br/>
|
||||
* In the documentProtection tag inside settings.xml file, <br/>
|
||||
* it sets the value of enforcement to "1" (w:enforcement="1") <br/>
|
||||
* and the value of edit to trackedChanges (w:edit="trackedChanges")<br/>
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="trackedChanges" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*/
|
||||
public void enforceTrackedChangesProtection() {
|
||||
settings.setEnforcementEditValue(STDocProtect.TRACKED_CHANGES);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove protection enforcement.<br/>
|
||||
* In the documentProtection tag inside settings.xml file <br/>
|
||||
* it sets the value of enforcement to "0" (w:enforcement="0") <br/>
|
||||
*/
|
||||
public void removeProtectionEnforcement() {
|
||||
settings.removeEnforcement();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ public final class XWPFRelation extends POIXMLRelation {
|
||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml",
|
||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings",
|
||||
"/word/settings.xml",
|
||||
null
|
||||
XWPFSettings.class
|
||||
);
|
||||
public static final XWPFRelation STYLES = new XWPFRelation(
|
||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml",
|
||||
|
135
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSettings.java
Normal file
135
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSettings.java
Normal file
@ -0,0 +1,135 @@
|
||||
/* ====================================================================
|
||||
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 java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
import org.apache.poi.POIXMLDocumentPart;
|
||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||
import org.apache.xmlbeans.XmlOptions;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocProtect;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSettings;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STDocProtect;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.SettingsDocument;
|
||||
|
||||
public class XWPFSettings extends POIXMLDocumentPart {
|
||||
|
||||
private CTSettings ctSettings;
|
||||
|
||||
public XWPFSettings(PackagePart part, PackageRelationship rel) throws IOException {
|
||||
super(part, rel);
|
||||
readFrom(part.getInputStream());
|
||||
}
|
||||
|
||||
public XWPFSettings() {
|
||||
super();
|
||||
ctSettings = CTSettings.Factory.newInstance();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Verifies the documentProtection tag inside settings.xml file <br/>
|
||||
* if the protection is enforced (w:enforcement="1") <br/>
|
||||
* and if the kind of protection equals to passed (STDocProtect.Enum editValue) <br/>
|
||||
*
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="readOnly" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*
|
||||
* @return true if documentProtection is enforced with option readOnly
|
||||
*/
|
||||
public boolean isEnforcedWith(STDocProtect.Enum editValue) {
|
||||
CTDocProtect ctDocProtect = ctSettings.getDocumentProtection();
|
||||
|
||||
if (ctDocProtect == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return ctDocProtect.getEnforcement().equals(STOnOff.X_1) && ctDocProtect.getEdit().equals(editValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enforces the protection with the option specified by passed editValue.<br/>
|
||||
* <br/>
|
||||
* In the documentProtection tag inside settings.xml file <br/>
|
||||
* it sets the value of enforcement to "1" (w:enforcement="1") <br/>
|
||||
* and the value of edit to the passed editValue (w:edit="[passed editValue]")<br/>
|
||||
* <br/>
|
||||
* sample snippet from settings.xml
|
||||
* <pre>
|
||||
* <w:settings ... >
|
||||
* <w:documentProtection w:edit="[passed editValue]" w:enforcement="1"/>
|
||||
* </pre>
|
||||
*/
|
||||
public void setEnforcementEditValue(org.openxmlformats.schemas.wordprocessingml.x2006.main.STDocProtect.Enum editValue) {
|
||||
safeGetDocumentProtection().setEnforcement(STOnOff.X_1);
|
||||
safeGetDocumentProtection().setEdit(editValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes protection enforcement.<br/>
|
||||
* In the documentProtection tag inside settings.xml file <br/>
|
||||
* it sets the value of enforcement to "0" (w:enforcement="0") <br/>
|
||||
*/
|
||||
public void removeEnforcement() {
|
||||
safeGetDocumentProtection().setEnforcement(STOnOff.X_0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void commit() throws IOException {
|
||||
|
||||
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
||||
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTSettings.type.getName().getNamespaceURI(), "settings"));
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
map.put("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w");
|
||||
xmlOptions.setSaveSuggestedPrefixes(map);
|
||||
|
||||
PackagePart part = getPackagePart();
|
||||
OutputStream out = part.getOutputStream();
|
||||
ctSettings.save(out, xmlOptions);
|
||||
out.close();
|
||||
}
|
||||
|
||||
private CTDocProtect safeGetDocumentProtection() {
|
||||
CTDocProtect documentProtection = ctSettings.getDocumentProtection();
|
||||
if (documentProtection == null) {
|
||||
documentProtection = CTDocProtect.Factory.newInstance();
|
||||
ctSettings.setDocumentProtection(documentProtection);
|
||||
}
|
||||
return ctSettings.getDocumentProtection();
|
||||
}
|
||||
|
||||
private void readFrom(InputStream inputStream) {
|
||||
try {
|
||||
ctSettings = SettingsDocument.Factory.parse(inputStream).getSettings();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
231
src/ooxml/testcases/org/apache/poi/xssf/TestSheetProtection.java
Normal file
231
src/ooxml/testcases/org/apache/poi/xssf/TestSheetProtection.java
Normal file
@ -0,0 +1,231 @@
|
||||
/* ====================================================================
|
||||
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.xssf;
|
||||
|
||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class TestSheetProtection extends TestCase {
|
||||
private XSSFSheet sheet;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("sheetProtection_not_protected.xlsx");
|
||||
sheet = workbook.getSheetAt(0);
|
||||
}
|
||||
|
||||
public void testShouldReadWorkbookProtection() throws Exception {
|
||||
assertFalse(sheet.isAutoFilterLocked());
|
||||
assertFalse(sheet.isDeleteColumnsLocked());
|
||||
assertFalse(sheet.isDeleteRowsLocked());
|
||||
assertFalse(sheet.isFormatCellsLocked());
|
||||
assertFalse(sheet.isFormatColumnsLocked());
|
||||
assertFalse(sheet.isFormatRowsLocked());
|
||||
assertFalse(sheet.isInsertColumnsLocked());
|
||||
assertFalse(sheet.isInsertHyperlinksLocked());
|
||||
assertFalse(sheet.isInsertRowsLocked());
|
||||
assertFalse(sheet.isPivotTablesLocked());
|
||||
assertFalse(sheet.isSortLocked());
|
||||
assertFalse(sheet.isObjectsLocked());
|
||||
assertFalse(sheet.isScenariosLocked());
|
||||
assertFalse(sheet.isSelectLockedCellsLocked());
|
||||
assertFalse(sheet.isSelectUnlockedCellsLocked());
|
||||
assertFalse(sheet.isSheetLocked());
|
||||
|
||||
sheet = XSSFTestDataSamples.openSampleWorkbook("sheetProtection_allLocked.xlsx").getSheetAt(0);
|
||||
|
||||
assertTrue(sheet.isAutoFilterLocked());
|
||||
assertTrue(sheet.isDeleteColumnsLocked());
|
||||
assertTrue(sheet.isDeleteRowsLocked());
|
||||
assertTrue(sheet.isFormatCellsLocked());
|
||||
assertTrue(sheet.isFormatColumnsLocked());
|
||||
assertTrue(sheet.isFormatRowsLocked());
|
||||
assertTrue(sheet.isInsertColumnsLocked());
|
||||
assertTrue(sheet.isInsertHyperlinksLocked());
|
||||
assertTrue(sheet.isInsertRowsLocked());
|
||||
assertTrue(sheet.isPivotTablesLocked());
|
||||
assertTrue(sheet.isSortLocked());
|
||||
assertTrue(sheet.isObjectsLocked());
|
||||
assertTrue(sheet.isScenariosLocked());
|
||||
assertTrue(sheet.isSelectLockedCellsLocked());
|
||||
assertTrue(sheet.isSelectUnlockedCellsLocked());
|
||||
assertTrue(sheet.isSheetLocked());
|
||||
}
|
||||
|
||||
public void testWriteAutoFilter() throws Exception {
|
||||
assertFalse(sheet.isAutoFilterLocked());
|
||||
sheet.lockAutoFilter();
|
||||
assertFalse(sheet.isAutoFilterLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isAutoFilterLocked());
|
||||
}
|
||||
|
||||
public void testWriteDeleteColumns() throws Exception {
|
||||
assertFalse(sheet.isDeleteColumnsLocked());
|
||||
sheet.lockDeleteColumns();
|
||||
assertFalse(sheet.isDeleteColumnsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isDeleteColumnsLocked());
|
||||
}
|
||||
|
||||
public void testWriteDeleteRows() throws Exception {
|
||||
assertFalse(sheet.isDeleteRowsLocked());
|
||||
sheet.lockDeleteRows();
|
||||
assertFalse(sheet.isDeleteRowsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isDeleteRowsLocked());
|
||||
}
|
||||
|
||||
public void testWriteFormatCells() throws Exception {
|
||||
assertFalse(sheet.isFormatCellsLocked());
|
||||
sheet.lockFormatCells();
|
||||
assertFalse(sheet.isFormatCellsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isFormatCellsLocked());
|
||||
}
|
||||
|
||||
public void testWriteFormatColumns() throws Exception {
|
||||
assertFalse(sheet.isFormatColumnsLocked());
|
||||
sheet.lockFormatColumns();
|
||||
assertFalse(sheet.isFormatColumnsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isFormatColumnsLocked());
|
||||
}
|
||||
|
||||
public void testWriteFormatRows() throws Exception {
|
||||
assertFalse(sheet.isFormatRowsLocked());
|
||||
sheet.lockFormatRows();
|
||||
assertFalse(sheet.isFormatRowsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isFormatRowsLocked());
|
||||
}
|
||||
|
||||
public void testWriteInsertColumns() throws Exception {
|
||||
assertFalse(sheet.isInsertColumnsLocked());
|
||||
sheet.lockInsertColumns();
|
||||
assertFalse(sheet.isInsertColumnsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isInsertColumnsLocked());
|
||||
}
|
||||
|
||||
public void testWriteInsertHyperlinks() throws Exception {
|
||||
assertFalse(sheet.isInsertHyperlinksLocked());
|
||||
sheet.lockInsertHyperlinks();
|
||||
assertFalse(sheet.isInsertHyperlinksLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isInsertHyperlinksLocked());
|
||||
}
|
||||
|
||||
public void testWriteInsertRows() throws Exception {
|
||||
assertFalse(sheet.isInsertRowsLocked());
|
||||
sheet.lockInsertRows();
|
||||
assertFalse(sheet.isInsertRowsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isInsertRowsLocked());
|
||||
}
|
||||
|
||||
public void testWritePivotTables() throws Exception {
|
||||
assertFalse(sheet.isPivotTablesLocked());
|
||||
sheet.lockPivotTables();
|
||||
assertFalse(sheet.isPivotTablesLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isPivotTablesLocked());
|
||||
}
|
||||
|
||||
public void testWriteSort() throws Exception {
|
||||
assertFalse(sheet.isSortLocked());
|
||||
sheet.lockSort();
|
||||
assertFalse(sheet.isSortLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isSortLocked());
|
||||
}
|
||||
|
||||
public void testWriteObjects() throws Exception {
|
||||
assertFalse(sheet.isObjectsLocked());
|
||||
sheet.lockObjects();
|
||||
assertFalse(sheet.isObjectsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isObjectsLocked());
|
||||
}
|
||||
|
||||
public void testWriteScenarios() throws Exception {
|
||||
assertFalse(sheet.isScenariosLocked());
|
||||
sheet.lockScenarios();
|
||||
assertFalse(sheet.isScenariosLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isScenariosLocked());
|
||||
}
|
||||
|
||||
public void testWriteSelectLockedCells() throws Exception {
|
||||
assertFalse(sheet.isSelectLockedCellsLocked());
|
||||
sheet.lockSelectLockedCells();
|
||||
assertFalse(sheet.isSelectLockedCellsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isSelectLockedCellsLocked());
|
||||
}
|
||||
|
||||
public void testWriteSelectUnlockedCells() throws Exception {
|
||||
assertFalse(sheet.isSelectUnlockedCellsLocked());
|
||||
sheet.lockSelectUnlockedCells();
|
||||
assertFalse(sheet.isSelectUnlockedCellsLocked());
|
||||
sheet.enableLocking();
|
||||
assertTrue(sheet.isSelectUnlockedCellsLocked());
|
||||
}
|
||||
|
||||
public void testWriteSelectEnableLocking() throws Exception {
|
||||
sheet = XSSFTestDataSamples.openSampleWorkbook("sheetProtection_allLocked.xlsx").getSheetAt(0);
|
||||
|
||||
assertTrue(sheet.isAutoFilterLocked());
|
||||
assertTrue(sheet.isDeleteColumnsLocked());
|
||||
assertTrue(sheet.isDeleteRowsLocked());
|
||||
assertTrue(sheet.isFormatCellsLocked());
|
||||
assertTrue(sheet.isFormatColumnsLocked());
|
||||
assertTrue(sheet.isFormatRowsLocked());
|
||||
assertTrue(sheet.isInsertColumnsLocked());
|
||||
assertTrue(sheet.isInsertHyperlinksLocked());
|
||||
assertTrue(sheet.isInsertRowsLocked());
|
||||
assertTrue(sheet.isPivotTablesLocked());
|
||||
assertTrue(sheet.isSortLocked());
|
||||
assertTrue(sheet.isObjectsLocked());
|
||||
assertTrue(sheet.isScenariosLocked());
|
||||
assertTrue(sheet.isSelectLockedCellsLocked());
|
||||
assertTrue(sheet.isSelectUnlockedCellsLocked());
|
||||
assertTrue(sheet.isSheetLocked());
|
||||
|
||||
sheet.disableLocking();
|
||||
|
||||
assertFalse(sheet.isAutoFilterLocked());
|
||||
assertFalse(sheet.isDeleteColumnsLocked());
|
||||
assertFalse(sheet.isDeleteRowsLocked());
|
||||
assertFalse(sheet.isFormatCellsLocked());
|
||||
assertFalse(sheet.isFormatColumnsLocked());
|
||||
assertFalse(sheet.isFormatRowsLocked());
|
||||
assertFalse(sheet.isInsertColumnsLocked());
|
||||
assertFalse(sheet.isInsertHyperlinksLocked());
|
||||
assertFalse(sheet.isInsertRowsLocked());
|
||||
assertFalse(sheet.isPivotTablesLocked());
|
||||
assertFalse(sheet.isSortLocked());
|
||||
assertFalse(sheet.isObjectsLocked());
|
||||
assertFalse(sheet.isScenariosLocked());
|
||||
assertFalse(sheet.isSelectLockedCellsLocked());
|
||||
assertFalse(sheet.isSelectUnlockedCellsLocked());
|
||||
assertFalse(sheet.isSheetLocked());
|
||||
}
|
||||
}
|
@ -0,0 +1,109 @@
|
||||
/* ====================================================================
|
||||
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.xssf;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
|
||||
public class TestWorkbookProtection extends TestCase {
|
||||
|
||||
public void testShouldReadWorkbookProtection() throws Exception {
|
||||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("workbookProtection_not_protected.xlsx");
|
||||
assertFalse(workbook.isStructureLocked());
|
||||
assertFalse(workbook.isWindowsLocked());
|
||||
assertFalse(workbook.isRevisionLocked());
|
||||
|
||||
workbook = XSSFTestDataSamples.openSampleWorkbook("workbookProtection_workbook_structure_protected.xlsx");
|
||||
assertTrue(workbook.isStructureLocked());
|
||||
assertFalse(workbook.isWindowsLocked());
|
||||
assertFalse(workbook.isRevisionLocked());
|
||||
|
||||
workbook = XSSFTestDataSamples.openSampleWorkbook("workbookProtection_workbook_windows_protected.xlsx");
|
||||
assertTrue(workbook.isWindowsLocked());
|
||||
assertFalse(workbook.isStructureLocked());
|
||||
assertFalse(workbook.isRevisionLocked());
|
||||
|
||||
workbook = XSSFTestDataSamples.openSampleWorkbook("workbookProtection_workbook_revision_protected.xlsx");
|
||||
assertTrue(workbook.isRevisionLocked());
|
||||
assertFalse(workbook.isWindowsLocked());
|
||||
assertFalse(workbook.isStructureLocked());
|
||||
}
|
||||
|
||||
public void testShouldWriteStructureLock() throws Exception {
|
||||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("workbookProtection_not_protected.xlsx");
|
||||
assertFalse(workbook.isStructureLocked());
|
||||
|
||||
workbook.lockStructure();
|
||||
|
||||
assertTrue(workbook.isStructureLocked());
|
||||
|
||||
workbook.unLockStructure();
|
||||
|
||||
assertFalse(workbook.isStructureLocked());
|
||||
}
|
||||
|
||||
public void testShouldWriteWindowsLock() throws Exception {
|
||||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("workbookProtection_not_protected.xlsx");
|
||||
assertFalse(workbook.isWindowsLocked());
|
||||
|
||||
workbook.lockWindows();
|
||||
|
||||
assertTrue(workbook.isWindowsLocked());
|
||||
|
||||
workbook.unLockWindows();
|
||||
|
||||
assertFalse(workbook.isWindowsLocked());
|
||||
}
|
||||
|
||||
public void testShouldWriteRevisionLock() throws Exception {
|
||||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("workbookProtection_not_protected.xlsx");
|
||||
assertFalse(workbook.isRevisionLocked());
|
||||
|
||||
workbook.lockRevision();
|
||||
|
||||
assertTrue(workbook.isRevisionLocked());
|
||||
|
||||
workbook.unLockRevision();
|
||||
|
||||
assertFalse(workbook.isRevisionLocked());
|
||||
}
|
||||
|
||||
public void testIntegration() throws Exception {
|
||||
XSSFWorkbook wb = new XSSFWorkbook();
|
||||
wb.createSheet("Testing purpose sheet");
|
||||
assertFalse(wb.isRevisionLocked());
|
||||
|
||||
wb.lockRevision();
|
||||
|
||||
File tempFile = File.createTempFile("workbookProtection", ".xlsx");
|
||||
FileOutputStream out = new FileOutputStream(tempFile);
|
||||
wb.write(out);
|
||||
out.close();
|
||||
|
||||
FileInputStream inputStream = new FileInputStream(tempFile);
|
||||
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
|
||||
inputStream.close();
|
||||
|
||||
assertTrue(workbook.isRevisionLocked());
|
||||
}
|
||||
}
|
@ -0,0 +1,153 @@
|
||||
/* ====================================================================
|
||||
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;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFRun;
|
||||
|
||||
public class TestDocumentProtection extends TestCase {
|
||||
|
||||
public void testShouldReadEnforcementProperties() throws Exception {
|
||||
|
||||
XWPFDocument documentWithoutDocumentProtectionTag = XWPFTestDataSamples.openSampleDocument("documentProtection_no_protection.docx");
|
||||
assertFalse(documentWithoutDocumentProtectionTag.isEnforcedReadonlyProtection());
|
||||
assertFalse(documentWithoutDocumentProtectionTag.isEnforcedFillingFormsProtection());
|
||||
assertFalse(documentWithoutDocumentProtectionTag.isEnforcedCommentsProtection());
|
||||
assertFalse(documentWithoutDocumentProtectionTag.isEnforcedTrackedChangesProtection());
|
||||
|
||||
XWPFDocument documentWithoutEnforcement = XWPFTestDataSamples.openSampleDocument("documentProtection_no_protection_tag_existing.docx");
|
||||
assertFalse(documentWithoutEnforcement.isEnforcedReadonlyProtection());
|
||||
assertFalse(documentWithoutEnforcement.isEnforcedFillingFormsProtection());
|
||||
assertFalse(documentWithoutEnforcement.isEnforcedCommentsProtection());
|
||||
assertFalse(documentWithoutEnforcement.isEnforcedTrackedChangesProtection());
|
||||
|
||||
XWPFDocument documentWithReadonlyEnforcement = XWPFTestDataSamples.openSampleDocument("documentProtection_readonly_no_password.docx");
|
||||
assertTrue(documentWithReadonlyEnforcement.isEnforcedReadonlyProtection());
|
||||
assertFalse(documentWithReadonlyEnforcement.isEnforcedFillingFormsProtection());
|
||||
assertFalse(documentWithReadonlyEnforcement.isEnforcedCommentsProtection());
|
||||
assertFalse(documentWithReadonlyEnforcement.isEnforcedTrackedChangesProtection());
|
||||
|
||||
XWPFDocument documentWithFillingFormsEnforcement = XWPFTestDataSamples.openSampleDocument("documentProtection_forms_no_password.docx");
|
||||
assertTrue(documentWithFillingFormsEnforcement.isEnforcedFillingFormsProtection());
|
||||
assertFalse(documentWithFillingFormsEnforcement.isEnforcedReadonlyProtection());
|
||||
assertFalse(documentWithFillingFormsEnforcement.isEnforcedCommentsProtection());
|
||||
assertFalse(documentWithFillingFormsEnforcement.isEnforcedTrackedChangesProtection());
|
||||
|
||||
XWPFDocument documentWithCommentsEnforcement = XWPFTestDataSamples.openSampleDocument("documentProtection_comments_no_password.docx");
|
||||
assertFalse(documentWithCommentsEnforcement.isEnforcedFillingFormsProtection());
|
||||
assertFalse(documentWithCommentsEnforcement.isEnforcedReadonlyProtection());
|
||||
assertTrue(documentWithCommentsEnforcement.isEnforcedCommentsProtection());
|
||||
assertFalse(documentWithCommentsEnforcement.isEnforcedTrackedChangesProtection());
|
||||
|
||||
XWPFDocument documentWithTrackedChangesEnforcement = XWPFTestDataSamples.openSampleDocument("documentProtection_trackedChanges_no_password.docx");
|
||||
assertFalse(documentWithTrackedChangesEnforcement.isEnforcedFillingFormsProtection());
|
||||
assertFalse(documentWithTrackedChangesEnforcement.isEnforcedReadonlyProtection());
|
||||
assertFalse(documentWithTrackedChangesEnforcement.isEnforcedCommentsProtection());
|
||||
assertTrue(documentWithTrackedChangesEnforcement.isEnforcedTrackedChangesProtection());
|
||||
|
||||
}
|
||||
|
||||
public void testShouldEnforceForReadOnly() throws Exception {
|
||||
// XWPFDocument document = createDocumentFromSampleFile("test-data/document/documentProtection_no_protection.docx");
|
||||
XWPFDocument document = XWPFTestDataSamples.openSampleDocument("documentProtection_no_protection.docx");
|
||||
assertFalse(document.isEnforcedReadonlyProtection());
|
||||
|
||||
document.enforceReadonlyProtection();
|
||||
|
||||
assertTrue(document.isEnforcedReadonlyProtection());
|
||||
}
|
||||
|
||||
public void testShouldEnforceForFillingForms() throws Exception {
|
||||
XWPFDocument document = createDocumentFromSampleFile("test-data/document/documentProtection_no_protection.docx");
|
||||
assertFalse(document.isEnforcedFillingFormsProtection());
|
||||
|
||||
document.enforceFillingFormsProtection();
|
||||
|
||||
assertTrue(document.isEnforcedFillingFormsProtection());
|
||||
}
|
||||
|
||||
public void testShouldEnforceForComments() throws Exception {
|
||||
XWPFDocument document = createDocumentFromSampleFile("test-data/document/documentProtection_no_protection.docx");
|
||||
assertFalse(document.isEnforcedCommentsProtection());
|
||||
|
||||
document.enforceCommentsProtection();
|
||||
|
||||
assertTrue(document.isEnforcedCommentsProtection());
|
||||
}
|
||||
|
||||
public void testShouldEnforceForTrackedChanges() throws Exception {
|
||||
XWPFDocument document = createDocumentFromSampleFile("test-data/document/documentProtection_no_protection.docx");
|
||||
assertFalse(document.isEnforcedTrackedChangesProtection());
|
||||
|
||||
document.enforceTrackedChangesProtection();
|
||||
|
||||
assertTrue(document.isEnforcedTrackedChangesProtection());
|
||||
}
|
||||
|
||||
public void testShouldUnsetEnforcement() throws Exception {
|
||||
XWPFDocument document = createDocumentFromSampleFile("test-data/document/documentProtection_readonly_no_password.docx");
|
||||
assertTrue(document.isEnforcedReadonlyProtection());
|
||||
|
||||
document.removeProtectionEnforcement();
|
||||
|
||||
assertFalse(document.isEnforcedReadonlyProtection());
|
||||
}
|
||||
|
||||
public void testIntegration() throws Exception {
|
||||
XWPFDocument doc = new XWPFDocument();
|
||||
|
||||
XWPFParagraph p1 = doc.createParagraph();
|
||||
|
||||
XWPFRun r1 = p1.createRun();
|
||||
r1.setText("Lorem ipsum dolor sit amet.");
|
||||
doc.enforceCommentsProtection();
|
||||
|
||||
File tempFile = File.createTempFile("documentProtectionFile", ".docx");
|
||||
FileOutputStream out = new FileOutputStream(tempFile);
|
||||
|
||||
doc.write(out);
|
||||
out.close();
|
||||
|
||||
FileInputStream inputStream = new FileInputStream(tempFile);
|
||||
XWPFDocument document = new XWPFDocument(inputStream);
|
||||
inputStream.close();
|
||||
|
||||
assertTrue(document.isEnforcedCommentsProtection());
|
||||
}
|
||||
|
||||
private XWPFDocument createDocumentFromSampleFile(String fileName) throws FileNotFoundException, IOException {
|
||||
File file = new File(fileName);
|
||||
FileInputStream in = new FileInputStream(file);
|
||||
byte[] bytes = new byte[(int) file.length()];
|
||||
in.read(bytes);
|
||||
|
||||
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
|
||||
XWPFDocument document = new XWPFDocument(inputStream);
|
||||
return document;
|
||||
}
|
||||
|
||||
}
|
BIN
test-data/document/documentProtection_comments_no_password.docx
Normal file
BIN
test-data/document/documentProtection_comments_no_password.docx
Normal file
Binary file not shown.
BIN
test-data/document/documentProtection_forms_no_password.docx
Normal file
BIN
test-data/document/documentProtection_forms_no_password.docx
Normal file
Binary file not shown.
BIN
test-data/document/documentProtection_no_protection.docx
Normal file
BIN
test-data/document/documentProtection_no_protection.docx
Normal file
Binary file not shown.
Binary file not shown.
BIN
test-data/document/documentProtection_readonly_no_password.docx
Normal file
BIN
test-data/document/documentProtection_readonly_no_password.docx
Normal file
Binary file not shown.
Binary file not shown.
BIN
test-data/document/protected_sample.docx
Normal file
BIN
test-data/document/protected_sample.docx
Normal file
Binary file not shown.
BIN
test-data/spreadsheet/sheetProtection_allLocked.xlsx
Normal file
BIN
test-data/spreadsheet/sheetProtection_allLocked.xlsx
Normal file
Binary file not shown.
BIN
test-data/spreadsheet/sheetProtection_not_protected.xlsx
Normal file
BIN
test-data/spreadsheet/sheetProtection_not_protected.xlsx
Normal file
Binary file not shown.
BIN
test-data/spreadsheet/workbookProtection_not_protected.xlsx
Normal file
BIN
test-data/spreadsheet/workbookProtection_not_protected.xlsx
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user