merge trunk to branch
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/hssf_cryptoapi@1756967 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9521546156
commit
71db60b890
13
build.xml
13
build.xml
@ -40,7 +40,7 @@ under the License.
|
|||||||
|
|
||||||
<description>The Apache POI project Ant build.</description>
|
<description>The Apache POI project Ant build.</description>
|
||||||
|
|
||||||
<property name="version.id" value="3.15-beta3"/>
|
<property name="version.id" value="3.15-beta4"/>
|
||||||
<property name="release.rc" value="RC1"/>
|
<property name="release.rc" value="RC1"/>
|
||||||
|
|
||||||
<property environment="env"/>
|
<property environment="env"/>
|
||||||
@ -283,12 +283,9 @@ under the License.
|
|||||||
NOTE: we did not update to 3.x yet because it requires Java 7, but we are still supporting Java 6 currently
|
NOTE: we did not update to 3.x yet because it requires Java 7, but we are still supporting Java 6 currently
|
||||||
===========================================================================================================
|
===========================================================================================================
|
||||||
-->
|
-->
|
||||||
<condition property="findbugs.jdk6">
|
<condition property="findbugs.version" value="2.0.3" else="3.0.1">
|
||||||
<equals arg1="${ant.java.version}" arg2="1.6"/>
|
<contains string="${java.version}" substring="1.6"/>
|
||||||
</condition>
|
</condition>
|
||||||
<property name="findbugs.version" value="2.0.3" if:set="findbugs.jdk6"/>
|
|
||||||
<property name="findbugs.version" value="3.0.1" unless:set="findbugs.jdk6"/>
|
|
||||||
<echo message="Findbugs-Version: ${findbugs.version} for Java ${ant.java.version}"/>
|
|
||||||
<property name="findbugs.url" value="http://prdownloads.sourceforge.net/findbugs/findbugs-noUpdateChecks-${findbugs.version}.zip?download"/>
|
<property name="findbugs.url" value="http://prdownloads.sourceforge.net/findbugs/findbugs-noUpdateChecks-${findbugs.version}.zip?download"/>
|
||||||
<property name="findbugs.jar" location="${main.lib}/findbugs-noUpdateChecks-${findbugs.version}.zip"/>
|
<property name="findbugs.jar" location="${main.lib}/findbugs-noUpdateChecks-${findbugs.version}.zip"/>
|
||||||
|
|
||||||
@ -441,7 +438,7 @@ under the License.
|
|||||||
<target name="help" description="Prints Apache POI's Ant usage help">
|
<target name="help" description="Prints Apache POI's Ant usage help">
|
||||||
<echo>
|
<echo>
|
||||||
This is POI ${version.id}
|
This is POI ${version.id}
|
||||||
Java Version ${ant.java.version}
|
Java Version ${ant.java.version}/${java.version}
|
||||||
Timestamp ${DSTAMP}
|
Timestamp ${DSTAMP}
|
||||||
The main targets of interest are:
|
The main targets of interest are:
|
||||||
- clean Erase all build work products (ie. everything in the build directory)
|
- clean Erase all build work products (ie. everything in the build directory)
|
||||||
@ -480,7 +477,9 @@ under the License.
|
|||||||
<mkdir dir="${dist.dir}"/>
|
<mkdir dir="${dist.dir}"/>
|
||||||
<mkdir dir="${build.site}"/>
|
<mkdir dir="${build.site}"/>
|
||||||
|
|
||||||
|
<echo message="Using Ant: ${ant.version} from ${ant.home}, Ant detected Java ${ant.java.version} (may be different than actual Java sometimes...)" />
|
||||||
<echo message="Using Java: ${java.version}/${java.runtime.version}/${java.vm.version}/${java.vm.name} from ${java.vm.vendor} on ${os.name}: ${os.version}" />
|
<echo message="Using Java: ${java.version}/${java.runtime.version}/${java.vm.version}/${java.vm.name} from ${java.vm.vendor} on ${os.name}: ${os.version}" />
|
||||||
|
<echo message="Using Findbugs: ${findbugs.version} for Java ${java.version}"/>
|
||||||
|
|
||||||
<scriptdef name="release_tag" language="javascript">
|
<scriptdef name="release_tag" language="javascript">
|
||||||
var rel = ("REL_"+project.getProperty("version.id")).toUpperCase().replace(/\W/g,"_");
|
var rel = ("REL_"+project.getProperty("version.id")).toUpperCase().replace(/\W/g,"_");
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi-parent</artifactId>
|
<artifactId>poi-parent</artifactId>
|
||||||
<version>3.15-beta3-SNAPSHOT</version>
|
<version>3.15-beta4-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>poi-examples</artifactId>
|
<artifactId>poi-examples</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi-parent</artifactId>
|
<artifactId>poi-parent</artifactId>
|
||||||
<version>3.15-beta3-SNAPSHOT</version>
|
<version>3.15-beta4-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>poi-excelant</artifactId>
|
<artifactId>poi-excelant</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi-parent</artifactId>
|
<artifactId>poi-parent</artifactId>
|
||||||
<version>3.15-beta3-SNAPSHOT</version>
|
<version>3.15-beta4-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>poi-main</artifactId>
|
<artifactId>poi-main</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi-parent</artifactId>
|
<artifactId>poi-parent</artifactId>
|
||||||
<version>3.15-beta3-SNAPSHOT</version>
|
<version>3.15-beta4-SNAPSHOT</version>
|
||||||
<relativePath>..</relativePath>
|
<relativePath>..</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>poi-ooxml-schema-encryption</artifactId>
|
<artifactId>poi-ooxml-schema-encryption</artifactId>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi-parent</artifactId>
|
<artifactId>poi-parent</artifactId>
|
||||||
<version>3.15-beta3-SNAPSHOT</version>
|
<version>3.15-beta4-SNAPSHOT</version>
|
||||||
<relativePath>..</relativePath>
|
<relativePath>..</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>poi-ooxml-schema-security</artifactId>
|
<artifactId>poi-ooxml-schema-security</artifactId>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi-parent</artifactId>
|
<artifactId>poi-parent</artifactId>
|
||||||
<version>3.15-beta3-SNAPSHOT</version>
|
<version>3.15-beta4-SNAPSHOT</version>
|
||||||
<relativePath>..</relativePath>
|
<relativePath>..</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>poi-ooxml-schema</artifactId>
|
<artifactId>poi-ooxml-schema</artifactId>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi-parent</artifactId>
|
<artifactId>poi-parent</artifactId>
|
||||||
<version>3.15-beta3-SNAPSHOT</version>
|
<version>3.15-beta4-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>poi-ooxml</artifactId>
|
<artifactId>poi-ooxml</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi-parent</artifactId>
|
<artifactId>poi-parent</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>3.15-beta3-SNAPSHOT</version>
|
<version>3.15-beta4-SNAPSHOT</version>
|
||||||
<name>Apache POI - the Java API for Microsoft Documents</name>
|
<name>Apache POI - the Java API for Microsoft Documents</name>
|
||||||
<description>Maven build of Apache POI for Sonar checks</description>
|
<description>Maven build of Apache POI for Sonar checks</description>
|
||||||
<url>http://poi.apache.org/</url>
|
<url>http://poi.apache.org/</url>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi-parent</artifactId>
|
<artifactId>poi-parent</artifactId>
|
||||||
<version>3.15-beta3-SNAPSHOT</version>
|
<version>3.15-beta4-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>poi-scratchpad</artifactId>
|
<artifactId>poi-scratchpad</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
@ -752,6 +752,10 @@ public class XSLFTextParagraph implements TextParagraph<XSLFShape,XSLFTextParagr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return master style text paragraph properties, or <code>null</code> if
|
||||||
|
* there are no master slides or the master slides do not contain a text paragraph
|
||||||
|
*/
|
||||||
/* package */ CTTextParagraphProperties getDefaultMasterStyle(){
|
/* package */ CTTextParagraphProperties getDefaultMasterStyle(){
|
||||||
CTPlaceholder ph = _shape.getCTPlaceholder();
|
CTPlaceholder ph = _shape.getCTPlaceholder();
|
||||||
String defaultStyleSelector;
|
String defaultStyleSelector;
|
||||||
@ -932,7 +936,11 @@ public class XSLFTextParagraph implements TextParagraph<XSLFShape,XSLFTextParagr
|
|||||||
public Double getDefaultFontSize() {
|
public Double getDefaultFontSize() {
|
||||||
CTTextCharacterProperties endPr = _p.getEndParaRPr();
|
CTTextCharacterProperties endPr = _p.getEndParaRPr();
|
||||||
if (endPr == null || !endPr.isSetSz()) {
|
if (endPr == null || !endPr.isSetSz()) {
|
||||||
endPr = getDefaultMasterStyle().getDefRPr();
|
// inherit the font size from the master style
|
||||||
|
CTTextParagraphProperties masterStyle = getDefaultMasterStyle();
|
||||||
|
if (masterStyle != null) {
|
||||||
|
endPr = masterStyle.getDefRPr();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100.);
|
return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100.);
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ public class TestSXSSFSheetAutoSizeColumn {
|
|||||||
// longCellValue ends up with approx. column width 10_000 (on my machine)
|
// longCellValue ends up with approx. column width 10_000 (on my machine)
|
||||||
// so shortCellValue can be expected to be < 5000 for all fonts
|
// so shortCellValue can be expected to be < 5000 for all fonts
|
||||||
// and longCellValue can be expected to be > 5000 for all fonts
|
// and longCellValue can be expected to be > 5000 for all fonts
|
||||||
private static final int COLUMN_WIDTH_THRESHOLD_BETWEEN_SHORT_AND_LONG = 5000;
|
private static final int COLUMN_WIDTH_THRESHOLD_BETWEEN_SHORT_AND_LONG = 4000;
|
||||||
private static final int MAX_COLUMN_WIDTH = 255*256;
|
private static final int MAX_COLUMN_WIDTH = 255*256;
|
||||||
|
|
||||||
private static final SortedSet<Integer> columns;
|
private static final SortedSet<Integer> columns;
|
||||||
|
@ -32,9 +32,9 @@ import org.apache.poi.poifs.filesystem.*;
|
|||||||
* @author Nick Burch
|
* @author Nick Burch
|
||||||
*/
|
*/
|
||||||
public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
||||||
private HSLFSlideShowImpl _hslfshow;
|
private final HSLFSlideShowImpl _hslfshow;
|
||||||
private HSLFSlideShow _show;
|
private final HSLFSlideShow _show;
|
||||||
private List<HSLFSlide> _slides;
|
private final List<HSLFSlide> _slides;
|
||||||
|
|
||||||
private boolean _slidesByDefault = true;
|
private boolean _slidesByDefault = true;
|
||||||
private boolean _notesByDefault = false;
|
private boolean _notesByDefault = false;
|
||||||
@ -256,14 +256,13 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
|||||||
|
|
||||||
// Comments, if requested and present
|
// Comments, if requested and present
|
||||||
if (getCommentText) {
|
if (getCommentText) {
|
||||||
Comment[] comments = slide.getComments();
|
for (Comment comment : slide.getComments()) {
|
||||||
for (int j = 0; j < comments.length; j++) {
|
ret.append(comment.getAuthor() + " - " + comment.getText() + "\n");
|
||||||
ret.append(comments[j].getAuthor() + " - " + comments[j].getText() + "\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (getNoteText) {
|
if (getNoteText) {
|
||||||
ret.append("\n");
|
ret.append('\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,7 +270,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
|||||||
// Not currently using _notes, as that can have the notes of
|
// Not currently using _notes, as that can have the notes of
|
||||||
// master sheets in. Grab Slide list, then work from there,
|
// master sheets in. Grab Slide list, then work from there,
|
||||||
// but ensure no duplicates
|
// but ensure no duplicates
|
||||||
HashSet<Integer> seenNotes = new HashSet<Integer>();
|
Set<Integer> seenNotes = new HashSet<Integer>();
|
||||||
String headerText = "";
|
String headerText = "";
|
||||||
String footerText = "";
|
String footerText = "";
|
||||||
HeadersFooters hf = _show.getNotesHeadersFooters();
|
HeadersFooters hf = _show.getNotesHeadersFooters();
|
||||||
@ -285,8 +284,8 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < _slides.size(); i++) {
|
for (HSLFSlide slide : _slides) {
|
||||||
HSLFNotes notes = _slides.get(i).getNotes();
|
HSLFNotes notes = slide.getNotes();
|
||||||
if (notes == null) {
|
if (notes == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -315,16 +314,18 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void extractTableText(StringBuffer ret, HSLFTable table) {
|
private void extractTableText(StringBuffer ret, HSLFTable table) {
|
||||||
for (int row = 0; row < table.getNumberOfRows(); row++){
|
final int nrows = table.getNumberOfRows();
|
||||||
for (int col = 0; col < table.getNumberOfColumns(); col++){
|
final int ncols = table.getNumberOfColumns();
|
||||||
|
for (int row = 0; row < nrows; row++){
|
||||||
|
for (int col = 0; col < ncols; col++){
|
||||||
HSLFTableCell cell = table.getCell(row, col);
|
HSLFTableCell cell = table.getCell(row, col);
|
||||||
//defensive null checks; don't know if they're necessary
|
//defensive null checks; don't know if they're necessary
|
||||||
if (cell != null){
|
if (cell != null){
|
||||||
String txt = cell.getText();
|
String txt = cell.getText();
|
||||||
txt = (txt == null) ? "" : txt;
|
txt = (txt == null) ? "" : txt;
|
||||||
ret.append(txt);
|
ret.append(txt);
|
||||||
if (col < table.getNumberOfColumns()-1){
|
if (col < ncols-1){
|
||||||
ret.append("\t");
|
ret.append('\t');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -339,7 +340,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
|||||||
for (List<HSLFTextParagraph> lp : paragraphs) {
|
for (List<HSLFTextParagraph> lp : paragraphs) {
|
||||||
ret.append(HSLFTextParagraph.getText(lp));
|
ret.append(HSLFTextParagraph.getText(lp));
|
||||||
if (ret.length() > 0 && ret.charAt(ret.length()-1) != '\n') {
|
if (ret.length() > 0 && ret.charAt(ret.length()-1) != '\n') {
|
||||||
ret.append("\n");
|
ret.append('\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,8 @@ import org.apache.poi.hslf.usermodel.HSLFTextShape;
|
|||||||
*/
|
*/
|
||||||
public final class HeadersFooters {
|
public final class HeadersFooters {
|
||||||
|
|
||||||
|
private static final String _ppt2007tag = "___PPT12";
|
||||||
|
|
||||||
private final HeadersFootersContainer _container;
|
private final HeadersFootersContainer _container;
|
||||||
private final HSLFSheet _sheet;
|
private final HSLFSheet _sheet;
|
||||||
private final boolean _ppt2007;
|
private final boolean _ppt2007;
|
||||||
@ -54,7 +56,7 @@ public final class HeadersFooters {
|
|||||||
|
|
||||||
// detect if this ppt was saved in Office2007
|
// detect if this ppt was saved in Office2007
|
||||||
String tag = ppt.getSlideMasters().get(0).getProgrammableTag();
|
String tag = ppt.getSlideMasters().get(0).getProgrammableTag();
|
||||||
_ppt2007 = "___PPT12".equals(tag);
|
_ppt2007 = _ppt2007tag.equals(tag);
|
||||||
|
|
||||||
SheetContainer sc = _sheet.getSheetContainer();
|
SheetContainer sc = _sheet.getSheetContainer();
|
||||||
HeadersFootersContainer hdd = (HeadersFootersContainer)sc.findFirstOfType(RecordTypes.HeadersFooters.typeID);
|
HeadersFootersContainer hdd = (HeadersFootersContainer)sc.findFirstOfType(RecordTypes.HeadersFooters.typeID);
|
||||||
|
@ -22,32 +22,10 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import org.apache.poi.hpsf.DocumentSummaryInformation;
|
import org.apache.poi.hpsf.DocumentSummaryInformation;
|
||||||
import org.apache.poi.hpsf.SummaryInformation;
|
import org.apache.poi.hpsf.SummaryInformation;
|
||||||
import org.apache.poi.hwpf.model.BookmarksTables;
|
import org.apache.poi.hwpf.model.*;
|
||||||
import org.apache.poi.hwpf.model.CHPBinTable;
|
|
||||||
import org.apache.poi.hwpf.model.ComplexFileTable;
|
|
||||||
import org.apache.poi.hwpf.model.DocumentProperties;
|
|
||||||
import org.apache.poi.hwpf.model.EscherRecordHolder;
|
|
||||||
import org.apache.poi.hwpf.model.FSPADocumentPart;
|
|
||||||
import org.apache.poi.hwpf.model.FSPATable;
|
|
||||||
import org.apache.poi.hwpf.model.FieldsTables;
|
|
||||||
import org.apache.poi.hwpf.model.FontTable;
|
|
||||||
import org.apache.poi.hwpf.model.ListTables;
|
|
||||||
import org.apache.poi.hwpf.model.NoteType;
|
|
||||||
import org.apache.poi.hwpf.model.NotesTables;
|
|
||||||
import org.apache.poi.hwpf.model.PAPBinTable;
|
|
||||||
import org.apache.poi.hwpf.model.PicturesTable;
|
|
||||||
import org.apache.poi.hwpf.model.RevisionMarkAuthorTable;
|
|
||||||
import org.apache.poi.hwpf.model.SavedByTable;
|
|
||||||
import org.apache.poi.hwpf.model.SectionTable;
|
|
||||||
import org.apache.poi.hwpf.model.SinglentonTextPiece;
|
|
||||||
import org.apache.poi.hwpf.model.StyleSheet;
|
|
||||||
import org.apache.poi.hwpf.model.SubdocumentType;
|
|
||||||
import org.apache.poi.hwpf.model.TextPiece;
|
|
||||||
import org.apache.poi.hwpf.model.TextPieceTable;
|
|
||||||
import org.apache.poi.hwpf.model.io.HWPFFileSystem;
|
import org.apache.poi.hwpf.model.io.HWPFFileSystem;
|
||||||
import org.apache.poi.hwpf.model.io.HWPFOutputStream;
|
import org.apache.poi.hwpf.model.io.HWPFOutputStream;
|
||||||
import org.apache.poi.hwpf.usermodel.Bookmarks;
|
import org.apache.poi.hwpf.usermodel.Bookmarks;
|
||||||
@ -572,12 +550,27 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Warning - not currently implemented for HWPF!
|
* Write out the word file that is represented by this class, to the
|
||||||
|
* currently open {@link File}, via the writeable {@link POIFSFileSystem}
|
||||||
|
* it was opened as.
|
||||||
|
*
|
||||||
|
* <p>This will fail (with an {@link IllegalStateException} if the
|
||||||
|
* Document was opened read-only, opened from an {@link InputStream}
|
||||||
|
* instead of a File, or if this is not the root document. For those cases,
|
||||||
|
* you must use {@link #write(OutputStream)} or {@link #write(File)} to
|
||||||
|
* write to a brand new document.
|
||||||
|
*
|
||||||
|
* @since 3.15
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void write() throws IOException {
|
public void write() throws IOException {
|
||||||
// TODO Implement
|
validateInPlaceWritePossible();
|
||||||
throw new IllegalStateException("Coming soon!");
|
|
||||||
|
// Update the Document+Properties streams in the file
|
||||||
|
write(directory.getFileSystem(), false);
|
||||||
|
|
||||||
|
// Sync with the File on disk
|
||||||
|
directory.getFileSystem().writeFilesystem();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -912,23 +905,18 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
dataBuf = tempBuf;
|
dataBuf = tempBuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create new document preserving order of entries
|
// Create a new document preserving order of entries / Update existing
|
||||||
// TODO Check "copyOtherEntries" and tweak behaviour based on that
|
|
||||||
// TODO That's needed for in-place write
|
|
||||||
boolean docWritten = false;
|
boolean docWritten = false;
|
||||||
boolean dataWritten = false;
|
boolean dataWritten = false;
|
||||||
boolean objectPoolWritten = false;
|
boolean objectPoolWritten = false;
|
||||||
boolean tableWritten = false;
|
boolean tableWritten = false;
|
||||||
boolean propertiesWritten = false;
|
boolean propertiesWritten = false;
|
||||||
for ( Iterator<Entry> iter = directory.getEntries(); iter.hasNext(); )
|
for (Entry entry : directory) {
|
||||||
{
|
|
||||||
Entry entry = iter.next();
|
|
||||||
if ( entry.getName().equals( STREAM_WORD_DOCUMENT ) )
|
if ( entry.getName().equals( STREAM_WORD_DOCUMENT ) )
|
||||||
{
|
{
|
||||||
if ( !docWritten )
|
if ( !docWritten )
|
||||||
{
|
{
|
||||||
pfs.createDocument( new ByteArrayInputStream( mainBuf ),
|
write(pfs, mainBuf, STREAM_WORD_DOCUMENT);
|
||||||
STREAM_WORD_DOCUMENT );
|
|
||||||
docWritten = true;
|
docWritten = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -936,7 +924,11 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
{
|
{
|
||||||
if ( !objectPoolWritten )
|
if ( !objectPoolWritten )
|
||||||
{
|
{
|
||||||
|
if ( copyOtherEntries ) {
|
||||||
_objectPool.writeTo( pfs.getRoot() );
|
_objectPool.writeTo( pfs.getRoot() );
|
||||||
|
} else {
|
||||||
|
// Object pool is already there, no need to change/copy
|
||||||
|
}
|
||||||
objectPoolWritten = true;
|
objectPoolWritten = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -945,8 +937,7 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
{
|
{
|
||||||
if ( !tableWritten )
|
if ( !tableWritten )
|
||||||
{
|
{
|
||||||
pfs.createDocument( new ByteArrayInputStream( tableBuf ),
|
write(pfs, tableBuf, STREAM_TABLE_1);
|
||||||
STREAM_TABLE_1 );
|
|
||||||
tableWritten = true;
|
tableWritten = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -965,29 +956,25 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
{
|
{
|
||||||
if ( !dataWritten )
|
if ( !dataWritten )
|
||||||
{
|
{
|
||||||
pfs.createDocument( new ByteArrayInputStream( dataBuf ),
|
write(pfs, dataBuf, STREAM_DATA);
|
||||||
STREAM_DATA );
|
|
||||||
dataWritten = true;
|
dataWritten = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if ( copyOtherEntries )
|
||||||
{
|
{
|
||||||
EntryUtils.copyNodeRecursively( entry, pfs.getRoot() );
|
EntryUtils.copyNodeRecursively( entry, pfs.getRoot() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !docWritten )
|
if ( !docWritten )
|
||||||
pfs.createDocument( new ByteArrayInputStream( mainBuf ),
|
write(pfs, mainBuf, STREAM_WORD_DOCUMENT);
|
||||||
STREAM_WORD_DOCUMENT );
|
|
||||||
if ( !tableWritten )
|
if ( !tableWritten )
|
||||||
pfs.createDocument( new ByteArrayInputStream( tableBuf ),
|
write(pfs, tableBuf, STREAM_TABLE_1);
|
||||||
STREAM_TABLE_1 );
|
|
||||||
if ( !propertiesWritten )
|
if ( !propertiesWritten )
|
||||||
writeProperties( pfs );
|
writeProperties( pfs );
|
||||||
if ( !dataWritten )
|
if ( !dataWritten )
|
||||||
pfs.createDocument( new ByteArrayInputStream( dataBuf ),
|
write(pfs, dataBuf, STREAM_DATA);
|
||||||
STREAM_DATA );
|
if ( !objectPoolWritten && copyOtherEntries )
|
||||||
if ( !objectPoolWritten )
|
|
||||||
_objectPool.writeTo( pfs.getRoot() );
|
_objectPool.writeTo( pfs.getRoot() );
|
||||||
|
|
||||||
this.directory = pfs.getRoot();
|
this.directory = pfs.getRoot();
|
||||||
@ -1000,6 +987,9 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
this._tableStream = tableStream.toByteArray();
|
this._tableStream = tableStream.toByteArray();
|
||||||
this._dataStream = dataBuf;
|
this._dataStream = dataBuf;
|
||||||
}
|
}
|
||||||
|
private static void write(NPOIFSFileSystem pfs, byte[] data, String name) throws IOException {
|
||||||
|
pfs.createOrUpdateDocument(new ByteArrayInputStream(data), name);
|
||||||
|
}
|
||||||
|
|
||||||
@Internal
|
@Internal
|
||||||
public byte[] getDataStream()
|
public byte[] getDataStream()
|
||||||
|
@ -24,6 +24,7 @@ import org.apache.poi.util.Internal;
|
|||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
|
|
||||||
@Internal
|
@Internal
|
||||||
public final class SectionSprmUncompressor extends SprmUncompressor
|
public final class SectionSprmUncompressor extends SprmUncompressor
|
||||||
{
|
{
|
||||||
@ -58,15 +59,14 @@ public final class SectionSprmUncompressor extends SprmUncompressor
|
|||||||
*/
|
*/
|
||||||
static void unCompressSEPOperation (SectionProperties newSEP, SprmOperation sprm)
|
static void unCompressSEPOperation (SectionProperties newSEP, SprmOperation sprm)
|
||||||
{
|
{
|
||||||
final int operation = sprm.getOperation();
|
int operation = sprm.getOperation();
|
||||||
final int operand = sprm.getOperand();
|
|
||||||
switch (operation)
|
switch (operation)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
newSEP.setCnsPgn ((byte) operand);
|
newSEP.setCnsPgn ((byte) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x1:
|
case 0x1:
|
||||||
newSEP.setIHeadingPgn ((byte) operand);
|
newSEP.setIHeadingPgn ((byte) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x2:
|
case 0x2:
|
||||||
byte[] buf = new byte[sprm.size() - 3];
|
byte[] buf = new byte[sprm.size() - 3];
|
||||||
@ -80,110 +80,110 @@ public final class SectionSprmUncompressor extends SprmUncompressor
|
|||||||
//not quite sure
|
//not quite sure
|
||||||
break;
|
break;
|
||||||
case 0x5:
|
case 0x5:
|
||||||
newSEP.setFEvenlySpaced (getFlag (operand));
|
newSEP.setFEvenlySpaced (getFlag (sprm.getOperand()));
|
||||||
break;
|
break;
|
||||||
case 0x6:
|
case 0x6:
|
||||||
newSEP.setFUnlocked (getFlag (operand));
|
newSEP.setFUnlocked (getFlag (sprm.getOperand()));
|
||||||
break;
|
break;
|
||||||
case 0x7:
|
case 0x7:
|
||||||
newSEP.setDmBinFirst ((short) operand);
|
newSEP.setDmBinFirst ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x8:
|
case 0x8:
|
||||||
newSEP.setDmBinOther ((short) operand);
|
newSEP.setDmBinOther ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x9:
|
case 0x9:
|
||||||
newSEP.setBkc ((byte) operand);
|
newSEP.setBkc ((byte) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0xa:
|
case 0xa:
|
||||||
newSEP.setFTitlePage (getFlag (operand));
|
newSEP.setFTitlePage (getFlag (sprm.getOperand()));
|
||||||
break;
|
break;
|
||||||
case 0xb:
|
case 0xb:
|
||||||
newSEP.setCcolM1 ((short) operand);
|
newSEP.setCcolM1 ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0xc:
|
case 0xc:
|
||||||
newSEP.setDxaColumns (operand);
|
newSEP.setDxaColumns (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0xd:
|
case 0xd:
|
||||||
newSEP.setFAutoPgn (getFlag (operand));
|
newSEP.setFAutoPgn (getFlag (sprm.getOperand()));
|
||||||
break;
|
break;
|
||||||
case 0xe:
|
case 0xe:
|
||||||
newSEP.setNfcPgn ((byte) operand);
|
newSEP.setNfcPgn ((byte) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0xf:
|
case 0xf:
|
||||||
newSEP.setDyaPgn ((short) operand);
|
newSEP.setDyaPgn ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x10:
|
case 0x10:
|
||||||
newSEP.setDxaPgn ((short) operand);
|
newSEP.setDxaPgn ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x11:
|
case 0x11:
|
||||||
newSEP.setFPgnRestart (getFlag (operand));
|
newSEP.setFPgnRestart (getFlag (sprm.getOperand()));
|
||||||
break;
|
break;
|
||||||
case 0x12:
|
case 0x12:
|
||||||
newSEP.setFEndNote (getFlag (operand));
|
newSEP.setFEndNote (getFlag (sprm.getOperand()));
|
||||||
break;
|
break;
|
||||||
case 0x13:
|
case 0x13:
|
||||||
newSEP.setLnc ((byte) operand);
|
newSEP.setLnc ((byte) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x14:
|
case 0x14:
|
||||||
newSEP.setGrpfIhdt ((byte) operand);
|
newSEP.setGrpfIhdt ((byte) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x15:
|
case 0x15:
|
||||||
newSEP.setNLnnMod ((short) operand);
|
newSEP.setNLnnMod ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x16:
|
case 0x16:
|
||||||
newSEP.setDxaLnn (operand);
|
newSEP.setDxaLnn (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x17:
|
case 0x17:
|
||||||
newSEP.setDyaHdrTop (operand);
|
newSEP.setDyaHdrTop (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x18:
|
case 0x18:
|
||||||
newSEP.setDyaHdrBottom (operand);
|
newSEP.setDyaHdrBottom (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x19:
|
case 0x19:
|
||||||
newSEP.setFLBetween (getFlag (operand));
|
newSEP.setFLBetween (getFlag (sprm.getOperand()));
|
||||||
break;
|
break;
|
||||||
case 0x1a:
|
case 0x1a:
|
||||||
newSEP.setVjc ((byte) operand);
|
newSEP.setVjc ((byte) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x1b:
|
case 0x1b:
|
||||||
newSEP.setLnnMin ((short) operand);
|
newSEP.setLnnMin ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x1c:
|
case 0x1c:
|
||||||
newSEP.setPgnStart ((short) operand);
|
newSEP.setPgnStart ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x1d:
|
case 0x1d:
|
||||||
newSEP.setDmOrientPage( operand != 0 );
|
newSEP.setDmOrientPage( sprm.getOperand() != 0 );
|
||||||
break;
|
break;
|
||||||
case 0x1e:
|
case 0x1e:
|
||||||
|
|
||||||
//nothing
|
//nothing
|
||||||
break;
|
break;
|
||||||
case 0x1f:
|
case 0x1f:
|
||||||
newSEP.setXaPage (operand);
|
newSEP.setXaPage (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x20:
|
case 0x20:
|
||||||
newSEP.setYaPage (operand);
|
newSEP.setYaPage (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x21:
|
case 0x21:
|
||||||
newSEP.setDxaLeft (operand);
|
newSEP.setDxaLeft (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x22:
|
case 0x22:
|
||||||
newSEP.setDxaRight (operand);
|
newSEP.setDxaRight (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x23:
|
case 0x23:
|
||||||
newSEP.setDyaTop (operand);
|
newSEP.setDyaTop (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x24:
|
case 0x24:
|
||||||
newSEP.setDyaBottom (operand);
|
newSEP.setDyaBottom (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x25:
|
case 0x25:
|
||||||
newSEP.setDzaGutter (operand);
|
newSEP.setDzaGutter (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x26:
|
case 0x26:
|
||||||
newSEP.setDmPaperReq ((short) operand);
|
newSEP.setDmPaperReq ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x27:
|
case 0x27:
|
||||||
newSEP.setFPropMark (getFlag (operand));
|
newSEP.setFPropMark (getFlag (sprm.getOperand()));
|
||||||
break;
|
break;
|
||||||
case 0x28:
|
case 0x28:
|
||||||
break;
|
break;
|
||||||
@ -204,40 +204,40 @@ public final class SectionSprmUncompressor extends SprmUncompressor
|
|||||||
newSEP.setBrcRight(new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
|
newSEP.setBrcRight(new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
|
||||||
break;
|
break;
|
||||||
case 0x2f:
|
case 0x2f:
|
||||||
newSEP.setPgbProp (operand);
|
newSEP.setPgbProp (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x30:
|
case 0x30:
|
||||||
newSEP.setDxtCharSpace (operand);
|
newSEP.setDxtCharSpace (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x31:
|
case 0x31:
|
||||||
newSEP.setDyaLinePitch (operand);
|
newSEP.setDyaLinePitch (sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x33:
|
case 0x33:
|
||||||
newSEP.setWTextFlow ((short) operand);
|
newSEP.setWTextFlow ((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x3C:
|
case 0x3C:
|
||||||
// [MS-DOC], v20140721, 2.6.4, sprmSRncFtn
|
// [MS-DOC], v20140721, 2.6.4, sprmSRncFtn
|
||||||
newSEP.setRncFtn((short) operand);
|
newSEP.setRncFtn((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x3E:
|
case 0x3E:
|
||||||
// [MS-DOC], v20140721, 2.6.4, sprmSRncEdn
|
// [MS-DOC], v20140721, 2.6.4, sprmSRncEdn
|
||||||
newSEP.setRncEdn((short) operand);
|
newSEP.setRncEdn((short) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x3F:
|
case 0x3F:
|
||||||
// [MS-DOC], v20140721, 2.6.4, sprmSNFtn
|
// [MS-DOC], v20140721, 2.6.4, sprmSNFtn
|
||||||
newSEP.setNFtn(operand);
|
newSEP.setNFtn((int) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x40:
|
case 0x40:
|
||||||
// [MS-DOC], v20140721, 2.6.4, sprmSNFtnRef
|
// [MS-DOC], v20140721, 2.6.4, sprmSNFtnRef
|
||||||
newSEP.setNfcFtnRef(operand);
|
newSEP.setNfcFtnRef((int) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x41:
|
case 0x41:
|
||||||
// [MS-DOC], v20140721, 2.6.4, sprmSNEdn
|
// [MS-DOC], v20140721, 2.6.4, sprmSNEdn
|
||||||
newSEP.setNEdn(operand);
|
newSEP.setNEdn((int) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
case 0x42:
|
case 0x42:
|
||||||
// [MS-DOC], v20140721, 2.6.4, sprmSNEdnRef
|
// [MS-DOC], v20140721, 2.6.4, sprmSNEdnRef
|
||||||
newSEP.setNfcEdnRef(operand);
|
newSEP.setNfcEdnRef((int) sprm.getOperand());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
logger.log(POILogger.INFO, "Unsupported Sprm operation: " + operation + " (" + HexDump.byteToHex(operation) + ")");
|
logger.log(POILogger.INFO, "Unsupported Sprm operation: " + operation + " (" + HexDump.byteToHex(operation) + ")");
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
package org.apache.poi.hslf.extractor;
|
package org.apache.poi.hslf.extractor;
|
||||||
|
|
||||||
import static org.apache.poi.POITestCase.assertContains;
|
import static org.apache.poi.POITestCase.assertContains;
|
||||||
|
import static org.apache.poi.POITestCase.assertContainsIgnoreCase;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
@ -26,7 +27,6 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
import org.apache.poi.POIDataSamples;
|
import org.apache.poi.POIDataSamples;
|
||||||
import org.apache.poi.hslf.model.OLEShape;
|
import org.apache.poi.hslf.model.OLEShape;
|
||||||
@ -355,7 +355,7 @@ public final class TestExtractor {
|
|||||||
ppe = new PowerPointExtractor(hslf);
|
ppe = new PowerPointExtractor(hslf);
|
||||||
|
|
||||||
text = ppe.getText();
|
text = ppe.getText();
|
||||||
assertContains(text.toLowerCase(Locale.ROOT), "master");
|
assertContainsIgnoreCase(text, "master");
|
||||||
assertContains(text, masterText);
|
assertContains(text, masterText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,11 +21,16 @@ import java.io.ByteArrayInputStream;
|
|||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
|
||||||
|
import org.apache.poi.POIDataSamples;
|
||||||
import org.apache.poi.hwpf.HWPFDocument;
|
import org.apache.poi.hwpf.HWPFDocument;
|
||||||
import org.apache.poi.hwpf.HWPFTestCase;
|
import org.apache.poi.hwpf.HWPFTestCase;
|
||||||
import org.apache.poi.hwpf.HWPFTestDataSamples;
|
import org.apache.poi.hwpf.HWPFTestDataSamples;
|
||||||
|
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
|
||||||
|
import org.apache.poi.poifs.filesystem.OPOIFSFileSystem;
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
|
import org.apache.poi.util.IOUtils;
|
||||||
import org.apache.poi.util.TempFile;
|
import org.apache.poi.util.TempFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -77,5 +82,63 @@ public final class TestHWPFWrite extends HWPFTestCase {
|
|||||||
doc.close();
|
doc.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO In-place write positive and negative checks
|
/**
|
||||||
|
* Writing to the file we opened from - note, uses a temp file to
|
||||||
|
* avoid changing our test files!
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
public void testInPlaceWrite() throws Exception {
|
||||||
|
// Setup as a copy of a known-good file
|
||||||
|
final File file = TempFile.createTempFile("TestDocument", ".doc");
|
||||||
|
IOUtils.copy(
|
||||||
|
POIDataSamples.getDocumentInstance().openResourceAsStream("SampleDoc.doc"),
|
||||||
|
new FileOutputStream(file)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Open from the temp file in read-write mode
|
||||||
|
HWPFDocument doc = new HWPFDocument(new NPOIFSFileSystem(file, false).getRoot());
|
||||||
|
Range r = doc.getRange();
|
||||||
|
assertEquals("I am a test document\r", r.getParagraph(0).text());
|
||||||
|
|
||||||
|
// Change
|
||||||
|
r.replaceText("X XX a test document\r", false);
|
||||||
|
|
||||||
|
// Save in-place, close, re-open and check
|
||||||
|
doc.write();
|
||||||
|
doc.close();
|
||||||
|
|
||||||
|
doc = new HWPFDocument(new NPOIFSFileSystem(file).getRoot());
|
||||||
|
assertEquals("X XX a test document\r", r.getParagraph(0).text());
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
public void testInvalidInPlaceWrite() throws Exception {
|
||||||
|
HWPFDocument doc;
|
||||||
|
|
||||||
|
// Can't work for InputStream opened files
|
||||||
|
doc = new HWPFDocument(
|
||||||
|
POIDataSamples.getDocumentInstance().openResourceAsStream("SampleDoc.doc"));
|
||||||
|
try {
|
||||||
|
doc.write();
|
||||||
|
fail("Shouldn't work for InputStream");
|
||||||
|
} catch (IllegalStateException e) {}
|
||||||
|
|
||||||
|
// Can't work for OPOIFS
|
||||||
|
OPOIFSFileSystem ofs = new OPOIFSFileSystem(
|
||||||
|
POIDataSamples.getDocumentInstance().openResourceAsStream("SampleDoc.doc"));
|
||||||
|
doc = new HWPFDocument(ofs.getRoot());
|
||||||
|
try {
|
||||||
|
doc.write();
|
||||||
|
fail("Shouldn't work for OPOIFSFileSystem");
|
||||||
|
} catch (IllegalStateException e) {}
|
||||||
|
|
||||||
|
// Can't work for Read-Only files
|
||||||
|
NPOIFSFileSystem fs = new NPOIFSFileSystem(
|
||||||
|
POIDataSamples.getDocumentInstance().getFile("SampleDoc.doc"), true);
|
||||||
|
doc = new HWPFDocument(fs.getRoot());
|
||||||
|
try {
|
||||||
|
doc.write();
|
||||||
|
fail("Shouldn't work for Read Only");
|
||||||
|
} catch (IllegalStateException e) {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,13 +32,16 @@ import java.security.PrivilegedActionException;
|
|||||||
import java.security.PrivilegedExceptionAction;
|
import java.security.PrivilegedExceptionAction;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.poi.util.SuppressForbidden;
|
import org.apache.poi.util.SuppressForbidden;
|
||||||
|
import org.apache.poi.util.Internal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Util class for POI JUnit TestCases, which provide additional features
|
* Util class for POI JUnit TestCases, which provide additional features
|
||||||
*/
|
*/
|
||||||
|
@Internal
|
||||||
public final class POITestCase {
|
public final class POITestCase {
|
||||||
public static void assertContains(String haystack, String needle) {
|
public static void assertContains(String haystack, String needle) {
|
||||||
assertNotNull(haystack);
|
assertNotNull(haystack);
|
||||||
@ -48,6 +51,19 @@ public final class POITestCase {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void assertContainsIgnoreCase(String haystack, String needle, Locale locale) {
|
||||||
|
assertNotNull(haystack);
|
||||||
|
assertNotNull(needle);
|
||||||
|
String hay = haystack.toLowerCase(locale);
|
||||||
|
String n = needle.toLowerCase(locale);
|
||||||
|
assertTrue("Unable to find expected text '" + needle + "' in text:\n" + haystack,
|
||||||
|
hay.contains(n)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
public static void assertContainsIgnoreCase(String haystack, String needle) {
|
||||||
|
assertContainsIgnoreCase(haystack, needle, Locale.ROOT);
|
||||||
|
}
|
||||||
|
|
||||||
public static void assertNotContained(String haystack, String needle) {
|
public static void assertNotContained(String haystack, String needle) {
|
||||||
assertNotNull(haystack);
|
assertNotNull(haystack);
|
||||||
assertFalse(
|
assertFalse(
|
||||||
|
126
src/testcases/org/apache/poi/TestPOITestCase.java
Normal file
126
src/testcases/org/apache/poi/TestPOITestCase.java
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
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;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.poi.POITestCase;
|
||||||
|
import org.junit.Ignore;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class for testing the POI Junit TestCase utility class
|
||||||
|
*/
|
||||||
|
public final class TestPOITestCase {
|
||||||
|
@Test
|
||||||
|
public void assertContains() {
|
||||||
|
POITestCase.assertContains("There is a needle in this haystack", "needle");
|
||||||
|
/*try {
|
||||||
|
POITestCase.assertContains("There is gold in this haystack", "needle");
|
||||||
|
fail("found a needle");
|
||||||
|
} catch (final junit.framework.AssertionFailedError e) {
|
||||||
|
// expected
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void assertContainsIgnoreCase_Locale() {
|
||||||
|
POITestCase.assertContainsIgnoreCase("There is a Needle in this haystack", "needlE", Locale.ROOT);
|
||||||
|
// FIXME: test failing case
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void assertContainsIgnoreCase() {
|
||||||
|
POITestCase.assertContainsIgnoreCase("There is a Needle in this haystack", "needlE");
|
||||||
|
// FIXME: test failing case
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void assertNotContained() {
|
||||||
|
POITestCase.assertNotContained("There is a needle in this haystack", "gold");
|
||||||
|
// FIXME: test failing case
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void assertMapContains() {
|
||||||
|
Map<String, String> haystack = Collections.singletonMap("needle", "value");
|
||||||
|
POITestCase.assertContains(haystack, "needle");
|
||||||
|
// FIXME: test failing case
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility method to get the value of a private/protected field.
|
||||||
|
* Only use this method in test cases!!!
|
||||||
|
*/
|
||||||
|
@Ignore
|
||||||
|
@Test
|
||||||
|
public void getFieldValue() {
|
||||||
|
/*
|
||||||
|
final Class<? super T> clazz;
|
||||||
|
final T instance;
|
||||||
|
final Class<R> fieldType;
|
||||||
|
final String fieldName;
|
||||||
|
|
||||||
|
final R expected;
|
||||||
|
final R actual = POITestCase.getFieldValue(clazz, instance, fieldType, fieldName);
|
||||||
|
assertEquals(expected, actual);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility method to call a private/protected method.
|
||||||
|
* Only use this method in test cases!!!
|
||||||
|
*/
|
||||||
|
@Ignore
|
||||||
|
@Test
|
||||||
|
public void callMethod() {
|
||||||
|
/*
|
||||||
|
final Class<? super T> clazz;
|
||||||
|
final T instance;
|
||||||
|
final Class<R> returnType;
|
||||||
|
final String methodName;
|
||||||
|
final Class<?>[] parameterTypes;
|
||||||
|
final Object[] parameters;
|
||||||
|
|
||||||
|
final R expected;
|
||||||
|
final R actual = POITestCase.callMethod(clazz, instance, returnType, methodName, parameterTypes, parameters);
|
||||||
|
assertEquals(expected, actual);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility method to shallow compare all fields of the objects
|
||||||
|
* Only use this method in test cases!!!
|
||||||
|
*/
|
||||||
|
@Ignore
|
||||||
|
@Test
|
||||||
|
public void assertReflectEquals() throws Exception {
|
||||||
|
/*
|
||||||
|
final Object expected;
|
||||||
|
final Object actual;
|
||||||
|
POITestCase.assertReflectEquals(expected, actual);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user