git-svn-id: https://svn.apache.org/repos/asf/poi/branches/hssf_cryptoapi@1756967 13f79535-47bb-0310-9956-ffa450edef68pull/38/head
@@ -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,13 +283,10 @@ 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.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"/> | |||
<propertyset id="junit.properties"> | |||
@@ -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,"_"); |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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; |
@@ -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; | |||
@@ -240,9 +240,9 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { | |||
} | |||
// Slide header, if set | |||
ret.append(headerText); | |||
ret.append(headerText); | |||
// Slide text | |||
// Slide text | |||
textRunsToText(ret, slide.getTextParagraphs()); | |||
// Table text | |||
@@ -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; | |||
} | |||
@@ -297,13 +296,13 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor { | |||
seenNotes.add(id); | |||
// Repeat the Notes header, if set | |||
ret.append(headerText); | |||
ret.append(headerText); | |||
// Notes text | |||
textRunsToText(ret, notes.getTextParagraphs()); | |||
textRunsToText(ret, notes.getTextParagraphs()); | |||
// Repeat the notes footer, if set | |||
ret.append(footerText); | |||
ret.append(footerText); | |||
} | |||
} | |||
@@ -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'); | |||
} | |||
} | |||
} |
@@ -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); |
@@ -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 ) | |||
{ | |||
_objectPool.writeTo( pfs.getRoot() ); | |||
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() |
@@ -24,11 +24,12 @@ 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 | |||
{ | |||
private static final POILogger logger = POILogFactory.getLogger(SectionSprmUncompressor.class); | |||
public SectionSprmUncompressor() | |||
{ | |||
} | |||
@@ -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) + ")"); |
@@ -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); | |||
} | |||
@@ -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; | |||
/** | |||
@@ -75,7 +80,65 @@ public final class TestHWPFWrite extends HWPFTestCase { | |||
r = doc.getRange(); | |||
assertEquals("I am a test document\r", r.getParagraph(0).text()); | |||
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.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); | |||
@@ -47,6 +50,19 @@ public final class POITestCase { | |||
haystack.contains(needle) | |||
); | |||
} | |||
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); |
@@ -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); | |||
*/ | |||
} | |||
} |