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:
Andreas Beeker 2016-08-19 20:57:56 +00:00
parent 892d978d4e
commit fdddabe430
20 changed files with 1415 additions and 1210 deletions

View File

@ -40,7 +40,7 @@ under the License.
<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 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
===========================================================================================================
-->
<condition property="findbugs.jdk6">
<equals arg1="${ant.java.version}" arg2="1.6"/>
<condition property="findbugs.version" value="2.0.3" else="3.0.1">
<contains string="${java.version}" substring="1.6"/>
</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.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">
<echo>
This is POI ${version.id}
Java Version ${ant.java.version}
Java Version ${ant.java.version}/${java.version}
Timestamp ${DSTAMP}
The main targets of interest are:
- 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="${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 Findbugs: ${findbugs.version} for Java ${java.version}"/>
<scriptdef name="release_tag" language="javascript">
var rel = ("REL_"+project.getProperty("version.id")).toUpperCase().replace(/\W/g,"_");

View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<version>3.15-beta3-SNAPSHOT</version>
<version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-examples</artifactId>
<packaging>jar</packaging>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<version>3.15-beta3-SNAPSHOT</version>
<version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-excelant</artifactId>
<packaging>jar</packaging>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<version>3.15-beta3-SNAPSHOT</version>
<version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-main</artifactId>
<packaging>jar</packaging>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<version>3.15-beta3-SNAPSHOT</version>
<version>3.15-beta4-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>poi-ooxml-schema-encryption</artifactId>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<version>3.15-beta3-SNAPSHOT</version>
<version>3.15-beta4-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>poi-ooxml-schema-security</artifactId>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<version>3.15-beta3-SNAPSHOT</version>
<version>3.15-beta4-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>poi-ooxml-schema</artifactId>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<version>3.15-beta3-SNAPSHOT</version>
<version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-ooxml</artifactId>
<packaging>jar</packaging>

View File

@ -3,7 +3,7 @@
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<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>
<description>Maven build of Apache POI for Sonar checks</description>
<url>http://poi.apache.org/</url>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<version>3.15-beta3-SNAPSHOT</version>
<version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-scratchpad</artifactId>
<packaging>jar</packaging>

View File

@ -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(){
CTPlaceholder ph = _shape.getCTPlaceholder();
String defaultStyleSelector;
@ -932,7 +936,11 @@ public class XSLFTextParagraph implements TextParagraph<XSLFShape,XSLFTextParagr
public Double getDefaultFontSize() {
CTTextCharacterProperties endPr = _p.getEndParaRPr();
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.);
}

View File

@ -63,7 +63,7 @@ public class TestSXSSFSheetAutoSizeColumn {
// longCellValue ends up with approx. column width 10_000 (on my machine)
// so shortCellValue 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 SortedSet<Integer> columns;

View File

@ -32,9 +32,9 @@ import org.apache.poi.poifs.filesystem.*;
* @author Nick Burch
*/
public final class PowerPointExtractor extends POIOLE2TextExtractor {
private HSLFSlideShowImpl _hslfshow;
private HSLFSlideShow _show;
private List<HSLFSlide> _slides;
private final HSLFSlideShowImpl _hslfshow;
private final HSLFSlideShow _show;
private final List<HSLFSlide> _slides;
private boolean _slidesByDefault = true;
private boolean _notesByDefault = false;
@ -256,14 +256,13 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
// Comments, if requested and present
if (getCommentText) {
Comment[] comments = slide.getComments();
for (int j = 0; j < comments.length; j++) {
ret.append(comments[j].getAuthor() + " - " + comments[j].getText() + "\n");
for (Comment comment : slide.getComments()) {
ret.append(comment.getAuthor() + " - " + comment.getText() + "\n");
}
}
}
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
// master sheets in. Grab Slide list, then work from there,
// but ensure no duplicates
HashSet<Integer> seenNotes = new HashSet<Integer>();
Set<Integer> seenNotes = new HashSet<Integer>();
String headerText = "";
String footerText = "";
HeadersFooters hf = _show.getNotesHeadersFooters();
@ -285,8 +284,8 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
}
for (int i = 0; i < _slides.size(); i++) {
HSLFNotes notes = _slides.get(i).getNotes();
for (HSLFSlide slide : _slides) {
HSLFNotes notes = slide.getNotes();
if (notes == null) {
continue;
}
@ -315,16 +314,18 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
}
private void extractTableText(StringBuffer ret, HSLFTable table) {
for (int row = 0; row < table.getNumberOfRows(); row++){
for (int col = 0; col < table.getNumberOfColumns(); col++){
final int nrows = table.getNumberOfRows();
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);
//defensive null checks; don't know if they're necessary
if (cell != null){
String txt = cell.getText();
txt = (txt == null) ? "" : txt;
ret.append(txt);
if (col < table.getNumberOfColumns()-1){
ret.append("\t");
if (col < ncols-1){
ret.append('\t');
}
}
}
@ -339,7 +340,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
for (List<HSLFTextParagraph> lp : paragraphs) {
ret.append(HSLFTextParagraph.getText(lp));
if (ret.length() > 0 && ret.charAt(ret.length()-1) != '\n') {
ret.append("\n");
ret.append('\n');
}
}
}

View File

@ -36,6 +36,8 @@ import org.apache.poi.hslf.usermodel.HSLFTextShape;
*/
public final class HeadersFooters {
private static final String _ppt2007tag = "___PPT12";
private final HeadersFootersContainer _container;
private final HSLFSheet _sheet;
private final boolean _ppt2007;
@ -54,7 +56,7 @@ public final class HeadersFooters {
// detect if this ppt was saved in Office2007
String tag = ppt.getSlideMasters().get(0).getProgrammableTag();
_ppt2007 = "___PPT12".equals(tag);
_ppt2007 = _ppt2007tag.equals(tag);
SheetContainer sc = _sheet.getSheetContainer();
HeadersFootersContainer hdd = (HeadersFootersContainer)sc.findFirstOfType(RecordTypes.HeadersFooters.typeID);

View File

@ -22,32 +22,10 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hwpf.model.BookmarksTables;
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.*;
import org.apache.poi.hwpf.model.io.HWPFFileSystem;
import org.apache.poi.hwpf.model.io.HWPFOutputStream;
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
public void write() throws IOException {
// TODO Implement
throw new IllegalStateException("Coming soon!");
validateInPlaceWritePossible();
// 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;
}
// create new document preserving order of entries
// TODO Check "copyOtherEntries" and tweak behaviour based on that
// TODO That's needed for in-place write
// Create a new document preserving order of entries / Update existing
boolean docWritten = false;
boolean dataWritten = false;
boolean objectPoolWritten = false;
boolean tableWritten = false;
boolean propertiesWritten = false;
for ( Iterator<Entry> iter = directory.getEntries(); iter.hasNext(); )
{
Entry entry = iter.next();
for (Entry entry : directory) {
if ( entry.getName().equals( STREAM_WORD_DOCUMENT ) )
{
if ( !docWritten )
{
pfs.createDocument( new ByteArrayInputStream( mainBuf ),
STREAM_WORD_DOCUMENT );
write(pfs, mainBuf, STREAM_WORD_DOCUMENT);
docWritten = true;
}
}
@ -936,7 +924,11 @@ public final class HWPFDocument extends HWPFDocumentCore {
{
if ( !objectPoolWritten )
{
if ( copyOtherEntries ) {
_objectPool.writeTo( pfs.getRoot() );
} else {
// Object pool is already there, no need to change/copy
}
objectPoolWritten = true;
}
}
@ -945,8 +937,7 @@ public final class HWPFDocument extends HWPFDocumentCore {
{
if ( !tableWritten )
{
pfs.createDocument( new ByteArrayInputStream( tableBuf ),
STREAM_TABLE_1 );
write(pfs, tableBuf, STREAM_TABLE_1);
tableWritten = true;
}
}
@ -965,29 +956,25 @@ public final class HWPFDocument extends HWPFDocumentCore {
{
if ( !dataWritten )
{
pfs.createDocument( new ByteArrayInputStream( dataBuf ),
STREAM_DATA );
write(pfs, dataBuf, STREAM_DATA);
dataWritten = true;
}
}
else
else if ( copyOtherEntries )
{
EntryUtils.copyNodeRecursively( entry, pfs.getRoot() );
}
}
if ( !docWritten )
pfs.createDocument( new ByteArrayInputStream( mainBuf ),
STREAM_WORD_DOCUMENT );
write(pfs, mainBuf, STREAM_WORD_DOCUMENT);
if ( !tableWritten )
pfs.createDocument( new ByteArrayInputStream( tableBuf ),
STREAM_TABLE_1 );
write(pfs, tableBuf, STREAM_TABLE_1);
if ( !propertiesWritten )
writeProperties( pfs );
if ( !dataWritten )
pfs.createDocument( new ByteArrayInputStream( dataBuf ),
STREAM_DATA );
if ( !objectPoolWritten )
write(pfs, dataBuf, STREAM_DATA);
if ( !objectPoolWritten && copyOtherEntries )
_objectPool.writeTo( pfs.getRoot() );
this.directory = pfs.getRoot();
@ -1000,6 +987,9 @@ public final class HWPFDocument extends HWPFDocumentCore {
this._tableStream = tableStream.toByteArray();
this._dataStream = dataBuf;
}
private static void write(NPOIFSFileSystem pfs, byte[] data, String name) throws IOException {
pfs.createOrUpdateDocument(new ByteArrayInputStream(data), name);
}
@Internal
public byte[] getDataStream()

View File

@ -24,6 +24,7 @@ import org.apache.poi.util.Internal;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
@Internal
public final class SectionSprmUncompressor extends SprmUncompressor
{
@ -58,15 +59,14 @@ public final class SectionSprmUncompressor extends SprmUncompressor
*/
static void unCompressSEPOperation (SectionProperties newSEP, SprmOperation sprm)
{
final int operation = sprm.getOperation();
final int operand = sprm.getOperand();
int operation = sprm.getOperation();
switch (operation)
{
case 0:
newSEP.setCnsPgn ((byte) operand);
newSEP.setCnsPgn ((byte) sprm.getOperand());
break;
case 0x1:
newSEP.setIHeadingPgn ((byte) operand);
newSEP.setIHeadingPgn ((byte) sprm.getOperand());
break;
case 0x2:
byte[] buf = new byte[sprm.size() - 3];
@ -80,110 +80,110 @@ public final class SectionSprmUncompressor extends SprmUncompressor
//not quite sure
break;
case 0x5:
newSEP.setFEvenlySpaced (getFlag (operand));
newSEP.setFEvenlySpaced (getFlag (sprm.getOperand()));
break;
case 0x6:
newSEP.setFUnlocked (getFlag (operand));
newSEP.setFUnlocked (getFlag (sprm.getOperand()));
break;
case 0x7:
newSEP.setDmBinFirst ((short) operand);
newSEP.setDmBinFirst ((short) sprm.getOperand());
break;
case 0x8:
newSEP.setDmBinOther ((short) operand);
newSEP.setDmBinOther ((short) sprm.getOperand());
break;
case 0x9:
newSEP.setBkc ((byte) operand);
newSEP.setBkc ((byte) sprm.getOperand());
break;
case 0xa:
newSEP.setFTitlePage (getFlag (operand));
newSEP.setFTitlePage (getFlag (sprm.getOperand()));
break;
case 0xb:
newSEP.setCcolM1 ((short) operand);
newSEP.setCcolM1 ((short) sprm.getOperand());
break;
case 0xc:
newSEP.setDxaColumns (operand);
newSEP.setDxaColumns (sprm.getOperand());
break;
case 0xd:
newSEP.setFAutoPgn (getFlag (operand));
newSEP.setFAutoPgn (getFlag (sprm.getOperand()));
break;
case 0xe:
newSEP.setNfcPgn ((byte) operand);
newSEP.setNfcPgn ((byte) sprm.getOperand());
break;
case 0xf:
newSEP.setDyaPgn ((short) operand);
newSEP.setDyaPgn ((short) sprm.getOperand());
break;
case 0x10:
newSEP.setDxaPgn ((short) operand);
newSEP.setDxaPgn ((short) sprm.getOperand());
break;
case 0x11:
newSEP.setFPgnRestart (getFlag (operand));
newSEP.setFPgnRestart (getFlag (sprm.getOperand()));
break;
case 0x12:
newSEP.setFEndNote (getFlag (operand));
newSEP.setFEndNote (getFlag (sprm.getOperand()));
break;
case 0x13:
newSEP.setLnc ((byte) operand);
newSEP.setLnc ((byte) sprm.getOperand());
break;
case 0x14:
newSEP.setGrpfIhdt ((byte) operand);
newSEP.setGrpfIhdt ((byte) sprm.getOperand());
break;
case 0x15:
newSEP.setNLnnMod ((short) operand);
newSEP.setNLnnMod ((short) sprm.getOperand());
break;
case 0x16:
newSEP.setDxaLnn (operand);
newSEP.setDxaLnn (sprm.getOperand());
break;
case 0x17:
newSEP.setDyaHdrTop (operand);
newSEP.setDyaHdrTop (sprm.getOperand());
break;
case 0x18:
newSEP.setDyaHdrBottom (operand);
newSEP.setDyaHdrBottom (sprm.getOperand());
break;
case 0x19:
newSEP.setFLBetween (getFlag (operand));
newSEP.setFLBetween (getFlag (sprm.getOperand()));
break;
case 0x1a:
newSEP.setVjc ((byte) operand);
newSEP.setVjc ((byte) sprm.getOperand());
break;
case 0x1b:
newSEP.setLnnMin ((short) operand);
newSEP.setLnnMin ((short) sprm.getOperand());
break;
case 0x1c:
newSEP.setPgnStart ((short) operand);
newSEP.setPgnStart ((short) sprm.getOperand());
break;
case 0x1d:
newSEP.setDmOrientPage( operand != 0 );
newSEP.setDmOrientPage( sprm.getOperand() != 0 );
break;
case 0x1e:
//nothing
break;
case 0x1f:
newSEP.setXaPage (operand);
newSEP.setXaPage (sprm.getOperand());
break;
case 0x20:
newSEP.setYaPage (operand);
newSEP.setYaPage (sprm.getOperand());
break;
case 0x21:
newSEP.setDxaLeft (operand);
newSEP.setDxaLeft (sprm.getOperand());
break;
case 0x22:
newSEP.setDxaRight (operand);
newSEP.setDxaRight (sprm.getOperand());
break;
case 0x23:
newSEP.setDyaTop (operand);
newSEP.setDyaTop (sprm.getOperand());
break;
case 0x24:
newSEP.setDyaBottom (operand);
newSEP.setDyaBottom (sprm.getOperand());
break;
case 0x25:
newSEP.setDzaGutter (operand);
newSEP.setDzaGutter (sprm.getOperand());
break;
case 0x26:
newSEP.setDmPaperReq ((short) operand);
newSEP.setDmPaperReq ((short) sprm.getOperand());
break;
case 0x27:
newSEP.setFPropMark (getFlag (operand));
newSEP.setFPropMark (getFlag (sprm.getOperand()));
break;
case 0x28:
break;
@ -204,40 +204,40 @@ public final class SectionSprmUncompressor extends SprmUncompressor
newSEP.setBrcRight(new BorderCode(sprm.getGrpprl(), sprm.getGrpprlOffset()));
break;
case 0x2f:
newSEP.setPgbProp (operand);
newSEP.setPgbProp (sprm.getOperand());
break;
case 0x30:
newSEP.setDxtCharSpace (operand);
newSEP.setDxtCharSpace (sprm.getOperand());
break;
case 0x31:
newSEP.setDyaLinePitch (operand);
newSEP.setDyaLinePitch (sprm.getOperand());
break;
case 0x33:
newSEP.setWTextFlow ((short) operand);
newSEP.setWTextFlow ((short) sprm.getOperand());
break;
case 0x3C:
// [MS-DOC], v20140721, 2.6.4, sprmSRncFtn
newSEP.setRncFtn((short) operand);
newSEP.setRncFtn((short) sprm.getOperand());
break;
case 0x3E:
// [MS-DOC], v20140721, 2.6.4, sprmSRncEdn
newSEP.setRncEdn((short) operand);
newSEP.setRncEdn((short) sprm.getOperand());
break;
case 0x3F:
// [MS-DOC], v20140721, 2.6.4, sprmSNFtn
newSEP.setNFtn(operand);
newSEP.setNFtn((int) sprm.getOperand());
break;
case 0x40:
// [MS-DOC], v20140721, 2.6.4, sprmSNFtnRef
newSEP.setNfcFtnRef(operand);
newSEP.setNfcFtnRef((int) sprm.getOperand());
break;
case 0x41:
// [MS-DOC], v20140721, 2.6.4, sprmSNEdn
newSEP.setNEdn(operand);
newSEP.setNEdn((int) sprm.getOperand());
break;
case 0x42:
// [MS-DOC], v20140721, 2.6.4, sprmSNEdnRef
newSEP.setNfcEdnRef(operand);
newSEP.setNfcEdnRef((int) sprm.getOperand());
break;
default:
logger.log(POILogger.INFO, "Unsupported Sprm operation: " + operation + " (" + HexDump.byteToHex(operation) + ")");

View File

@ -18,6 +18,7 @@
package org.apache.poi.hslf.extractor;
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.assertFalse;
import static org.junit.Assert.assertNotNull;
@ -26,7 +27,6 @@ import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Locale;
import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.model.OLEShape;
@ -355,7 +355,7 @@ public final class TestExtractor {
ppe = new PowerPointExtractor(hslf);
text = ppe.getText();
assertContains(text.toLowerCase(Locale.ROOT), "master");
assertContainsIgnoreCase(text, "master");
assertContains(text, masterText);
}

View File

@ -21,11 +21,16 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.POIDataSamples;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.HWPFTestCase;
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.util.IOUtils;
import org.apache.poi.util.TempFile;
/**
@ -77,5 +82,63 @@ public final class TestHWPFWrite extends HWPFTestCase {
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) {}
}
}

View File

@ -32,13 +32,16 @@ import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.poi.util.SuppressForbidden;
import org.apache.poi.util.Internal;
/**
* Util class for POI JUnit TestCases, which provide additional features
*/
@Internal
public final class POITestCase {
public static void assertContains(String haystack, String needle) {
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) {
assertNotNull(haystack);
assertFalse(

View 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);
*/
}
}