diff options
author | Rainer Klute <klute@apache.org> | 2006-03-03 16:57:55 +0000 |
---|---|---|
committer | Rainer Klute <klute@apache.org> | 2006-03-03 16:57:55 +0000 |
commit | 73a9af683f7c986421d12e07e680111d94a609c4 (patch) | |
tree | b315b5320a537d72619cae55c393357f4737b5c0 /src/testcases/org/apache/poi/hpsf | |
parent | a36d020021bb41eade6d653005ef42f60a0a609a (diff) | |
download | poi-73a9af683f7c986421d12e07e680111d94a609c4.tar.gz poi-73a9af683f7c986421d12e07e680111d94a609c4.zip |
* Writing support added to the SummaryInformation and DocumentSummaryInformation classes. These classes now have methods for setting and removing properties. Coherent extensions are:
** Documentation section about writing standard properties added to the HPSF HOW-TO.
** Example application added showing how to modify the document summary information.
** Testcases added for testing modifying summary information and document summary information.
** PropertySetFactory extended to create SummaryInformation and DocumentSummaryInformation instances.
* Added MutablePropertySet.write(DirectoryEntry, String) to ease writing a property set to a POI filesystem document.
* Improved codepage handling.
* Bug fixed: Integral values were read and written as unsigned instead of signed.
* Reworked the mapping between variant types and Java types: Variant.VT_I4 is mapped to Integer now and Variant.VT_I8 to Long. This might cause incompatibilities if you are doing low-level HPSF programming.
* Changed SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID from a byte[] to a byte[][] in order to contain the format ID of the first and the second section. This is an incompatible change!
* Added PropertySet.getFirstSection(). This method is similar to getSingleSection() won't choke if the property set has more than one section.
* Support for low-level reading and writing of Variant.VT_I8 type properties added.
* Unnecessary casts removed.
* Poibrowser's display format changed slightly.
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@382887 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/testcases/org/apache/poi/hpsf')
-rw-r--r-- | src/testcases/org/apache/poi/hpsf/basic/AllDataFilesTester.java | 82 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hpsf/basic/TestBasic.java | 8 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hpsf/basic/TestClassID.java | 292 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hpsf/basic/TestEmptyProperties.java | 9 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hpsf/basic/TestMetaDataIPI.java | 827 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hpsf/basic/TestUnicode.java | 7 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hpsf/basic/TestWrite.java | 36 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/hpsf/basic/TestWriteWellKnown.java | 763 | ||||
-rw-r--r--[-rwxr-xr-x] | src/testcases/org/apache/poi/hpsf/data/TestCorel.shw | bin | 76800 -> 76800 bytes | |||
-rw-r--r--[-rwxr-xr-x] | src/testcases/org/apache/poi/hpsf/data/TestGermanWord90.doc | bin | 19456 -> 19456 bytes | |||
-rw-r--r--[-rwxr-xr-x] | src/testcases/org/apache/poi/hpsf/data/TestRobert_Flaherty.doc | bin | 22528 -> 22528 bytes | |||
-rw-r--r-- | src/testcases/org/apache/poi/hpsf/data/TestWriteWellKnown.doc | bin | 0 -> 19968 bytes |
12 files changed, 1855 insertions, 169 deletions
diff --git a/src/testcases/org/apache/poi/hpsf/basic/AllDataFilesTester.java b/src/testcases/org/apache/poi/hpsf/basic/AllDataFilesTester.java new file mode 100644 index 0000000000..7396f41675 --- /dev/null +++ b/src/testcases/org/apache/poi/hpsf/basic/AllDataFilesTester.java @@ -0,0 +1,82 @@ +/* ==================================================================== + Copyright 2002-2006 Apache Software Foundation + + Licensed 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.hpsf.basic; + +import java.io.File; +import java.io.FileFilter; +import java.util.logging.Logger; + +/** + * <p>Processes a test method for all OLE2 files in the HPSF test data + * directory. Well, this class does not check whether a file is an OLE2 file but + * rather whether its name begins with "Test".</p> + * + * @author Rainer Klute <a + * href="mailto:klute@rainer-klute.de"><klute@rainer-klute.de></a> + * @since 2006-02-11 + * @version $Id$ + */ +public class AllDataFilesTester +{ + + /** + * <p>Interface specifying how to run a test on a single file.</p> + * + * @author Rainer Klute <a + * href="mailto:klute@rainer-klute.de"><klute@rainer-klute.de></a> + * @since 2006-02-11 + * @version $Id$ + */ + public interface TestTask + { + /** + * <p>Executes a test on a single file.</p> + * + * @param file the file + * @throws Throwable if the method throws anything. + */ + void runTest(File file) throws Throwable; + } + + /** + * <p>Tests the simplified custom properties.</p> + * + * @param task the task to execute + * @throws Throwable + */ + public void runTests(final TestTask task) throws Throwable + { + final String dataDirName = System.getProperty("HPSF.testdata.path"); + final File dataDir = new File(dataDirName); + final File[] docs = dataDir.listFiles(new FileFilter() + { + public boolean accept(final File file) + { + return file.isFile() && file.getName().startsWith("Test"); + }}); + for (int i = 0; i < docs.length; i++) + { + final File doc = docs[i]; + final Logger logger = Logger.getLogger(getClass().getName()); + logger.info("Processing file \" " + doc.toString() + "\"."); + + /* Execute the test task. */ + task.runTest(doc); + } + } + +} diff --git a/src/testcases/org/apache/poi/hpsf/basic/TestBasic.java b/src/testcases/org/apache/poi/hpsf/basic/TestBasic.java index e3b66725ad..0ac068dac2 100644 --- a/src/testcases/org/apache/poi/hpsf/basic/TestBasic.java +++ b/src/testcases/org/apache/poi/hpsf/basic/TestBasic.java @@ -112,10 +112,8 @@ public class TestBasic extends TestCase /** * <p>Checks the names of the files in the POI filesystem. They * are expected to be in a certain order.</p> - * - * @exception IOException if an I/O exception occurs */ - public void testReadFiles() throws IOException + public void testReadFiles() { String[] expected = POI_FILES; for (int i = 0; i < expected.length; i++) @@ -166,7 +164,7 @@ public class TestBasic extends TestCase o = ex; } in.close(); - Assert.assertEquals(o.getClass(), expected[i]); + Assert.assertEquals(expected[i], o.getClass()); } } @@ -223,7 +221,7 @@ public class TestBasic extends TestCase Assert.assertNotNull(s.getProperties()); Assert.assertEquals(17, s.getPropertyCount()); Assert.assertEquals("Titel", s.getProperty(2)); - Assert.assertEquals(1764, s.getSize()); + Assert.assertEquals(1748, s.getSize()); } diff --git a/src/testcases/org/apache/poi/hpsf/basic/TestClassID.java b/src/testcases/org/apache/poi/hpsf/basic/TestClassID.java index 03678d940b..490017c6d8 100644 --- a/src/testcases/org/apache/poi/hpsf/basic/TestClassID.java +++ b/src/testcases/org/apache/poi/hpsf/basic/TestClassID.java @@ -1,145 +1,147 @@ -
-/* ====================================================================
- Copyright 2002-2004 Apache Software Foundation
-
- Licensed 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.hpsf.basic;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.apache.poi.hpsf.ClassID;
-
-/**
- * <p>Tests ClassID structure.</p>
- *
- * @author Michael Zalewski (zalewski@optonline.net)
- */
-public class TestClassID extends TestCase
-{
- /**
- * <p>Constructor</p>
- *
- * @param name the test case's name
- */
- public TestClassID(final String name)
- {
- super(name);
- }
-
- /**
- * Various tests of overridden .equals()
- */
- public void testEquals()
- {
- ClassID clsidTest1 = new ClassID(
- new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}
- , 0
- );
- ClassID clsidTest2 = new ClassID(
- new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}
- , 0
- );
- ClassID clsidTest3 = new ClassID(
- new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11 }
- , 0
- );
- Assert.assertEquals(clsidTest1, clsidTest1);
- Assert.assertEquals(clsidTest1, clsidTest2);
- Assert.assertFalse(clsidTest1.equals(clsidTest3));
- Assert.assertFalse(clsidTest1.equals(null));
- }
- /**
- * Try to write to a buffer that is too small. This should
- * throw an Exception
- */
- public void testWriteArrayStoreException()
- {
- ClassID clsidTest = new ClassID(
- new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}
- , 0
- );
- boolean bExceptionOccurred = false;
- try
- {
- clsidTest.write(new byte[15], 0);
- }
- catch (Exception e)
- {
- bExceptionOccurred = true;
- }
- Assert.assertTrue(bExceptionOccurred);
-
- bExceptionOccurred = false;
- try
- {
- clsidTest.write(new byte[16], 1);
- }
- catch (Exception e)
- {
- bExceptionOccurred = true;
- }
- Assert.assertTrue(bExceptionOccurred);
-
- // These should work without throwing an Exception
- bExceptionOccurred = false;
- try
- {
- clsidTest.write(new byte[16], 0);
- clsidTest.write(new byte[17], 1);
- }
- catch (Exception e)
- {
- bExceptionOccurred = true;
- }
- Assert.assertFalse(bExceptionOccurred);
- }
- /**
- * <p>Tests the {@link PropertySet} methods. The test file has two
- * property set: the first one is a {@link SummaryInformation},
- * the second one is a {@link DocumentSummaryInformation}.</p>
- */
- public void testClassID()
- {
- ClassID clsidTest = new ClassID(
- new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}
- , 0
- );
- Assert.assertEquals(clsidTest.toString().toUpperCase(),
- "{04030201-0605-0807-090A-0B0C0D0E0F10}"
- );
- }
-
-
-
- /**
- * <p>Runs the test cases stand-alone.</p>
- *
- * @param args Command-line parameters (ignored)
- */
- public static void main(final String[] args)
- {
- System.setProperty("HPSF.testdata.path",
- "./src/testcases/org/apache/poi/hpsf/data");
- junit.textui.TestRunner.run(TestClassID.class);
- }
-
-}
+/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed 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.hpsf.basic; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.poi.hpsf.ClassID; +import org.apache.poi.hpsf.DocumentSummaryInformation; +import org.apache.poi.hpsf.PropertySet; +import org.apache.poi.hpsf.SummaryInformation; + +/** + * <p>Tests ClassID structure.</p> + * + * @author Michael Zalewski (zalewski@optonline.net) + */ +public class TestClassID extends TestCase +{ + /** + * <p>Constructor</p> + * + * @param name the test case's name + */ + public TestClassID(final String name) + { + super(name); + } + + /** + * Various tests of overridden .equals() + */ + public void testEquals() + { + ClassID clsidTest1 = new ClassID( + new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10} + , 0 + ); + ClassID clsidTest2 = new ClassID( + new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10} + , 0 + ); + ClassID clsidTest3 = new ClassID( + new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11 } + , 0 + ); + Assert.assertEquals(clsidTest1, clsidTest1); + Assert.assertEquals(clsidTest1, clsidTest2); + Assert.assertFalse(clsidTest1.equals(clsidTest3)); + Assert.assertFalse(clsidTest1.equals(null)); + } + /** + * Try to write to a buffer that is too small. This should + * throw an Exception + */ + public void testWriteArrayStoreException() + { + ClassID clsidTest = new ClassID( + new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10} + , 0 + ); + boolean bExceptionOccurred = false; + try + { + clsidTest.write(new byte[15], 0); + } + catch (Exception e) + { + bExceptionOccurred = true; + } + Assert.assertTrue(bExceptionOccurred); + + bExceptionOccurred = false; + try + { + clsidTest.write(new byte[16], 1); + } + catch (Exception e) + { + bExceptionOccurred = true; + } + Assert.assertTrue(bExceptionOccurred); + + // These should work without throwing an Exception + bExceptionOccurred = false; + try + { + clsidTest.write(new byte[16], 0); + clsidTest.write(new byte[17], 1); + } + catch (Exception e) + { + bExceptionOccurred = true; + } + Assert.assertFalse(bExceptionOccurred); + } + /** + * <p>Tests the {@link PropertySet} methods. The test file has two + * property set: the first one is a {@link SummaryInformation}, + * the second one is a {@link DocumentSummaryInformation}.</p> + */ + public void testClassID() + { + ClassID clsidTest = new ClassID( + new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10} + , 0 + ); + Assert.assertEquals(clsidTest.toString().toUpperCase(), + "{04030201-0605-0807-090A-0B0C0D0E0F10}" + ); + } + + + + /** + * <p>Runs the test cases stand-alone.</p> + * + * @param args Command-line parameters (ignored) + */ + public static void main(final String[] args) + { + System.setProperty("HPSF.testdata.path", + "./src/testcases/org/apache/poi/hpsf/data"); + junit.textui.TestRunner.run(TestClassID.class); + } + +} diff --git a/src/testcases/org/apache/poi/hpsf/basic/TestEmptyProperties.java b/src/testcases/org/apache/poi/hpsf/basic/TestEmptyProperties.java index 59fe77418c..9f813d3ce3 100644 --- a/src/testcases/org/apache/poi/hpsf/basic/TestEmptyProperties.java +++ b/src/testcases/org/apache/poi/hpsf/basic/TestEmptyProperties.java @@ -1,4 +1,3 @@ - /* ==================================================================== Copyright 2002-2004 Apache Software Foundation @@ -27,16 +26,18 @@ import java.io.UnsupportedEncodingException; import junit.framework.Assert; import junit.framework.TestCase; +import org.apache.poi.hpsf.DocumentSummaryInformation; import org.apache.poi.hpsf.HPSFException; import org.apache.poi.hpsf.MarkUnsupportedException; import org.apache.poi.hpsf.NoPropertySetStreamException; import org.apache.poi.hpsf.PropertySet; import org.apache.poi.hpsf.PropertySetFactory; import org.apache.poi.hpsf.SummaryInformation; +import org.apache.poi.hpsf.Variant; /** * <p>Test case for OLE2 files with empty properties. An empty property's type - * is {@link Variant.VT_EMPTY}.</p> + * is {@link Variant#VT_EMPTY}.</p> * * @author Rainer Klute <a * href="mailto:klute@rainer-klute.de"><klute@rainer-klute.de></a> @@ -96,10 +97,8 @@ public class TestEmptyProperties extends TestCase /** * <p>Checks the names of the files in the POI filesystem. They * are expected to be in a certain order.</p> - * - * @exception IOException if an I/O exception occurs */ - public void testReadFiles() throws IOException + public void testReadFiles() { String[] expected = POI_FILES; for (int i = 0; i < expected.length; i++) diff --git a/src/testcases/org/apache/poi/hpsf/basic/TestMetaDataIPI.java b/src/testcases/org/apache/poi/hpsf/basic/TestMetaDataIPI.java new file mode 100644 index 0000000000..00fcd2e501 --- /dev/null +++ b/src/testcases/org/apache/poi/hpsf/basic/TestMetaDataIPI.java @@ -0,0 +1,827 @@ +/* ====================================================================
+ Copyright 2002-2006 Apache Software Foundation
+
+ Licensed 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.hpsf.basic;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.Random;
+
+import junit.framework.TestCase;
+
+import org.apache.poi.hpsf.CustomProperties;
+import org.apache.poi.hpsf.DocumentSummaryInformation;
+import org.apache.poi.hpsf.MarkUnsupportedException;
+import org.apache.poi.hpsf.NoPropertySetStreamException;
+import org.apache.poi.hpsf.PropertySet;
+import org.apache.poi.hpsf.PropertySetFactory;
+import org.apache.poi.hpsf.SummaryInformation;
+import org.apache.poi.hpsf.UnexpectedPropertySetTypeException;
+import org.apache.poi.hpsf.WritingNotSupportedException;
+import org.apache.poi.poifs.filesystem.DirectoryEntry;
+import org.apache.poi.poifs.filesystem.DocumentEntry;
+import org.apache.poi.poifs.filesystem.DocumentInputStream;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+/**
+ * Basing on: src/examples/src/org/apache/poi/hpsf/examples/ModifyDocumentSummaryInformation.java
+ * This class tests reading and writing of meta data. No actual document is created. All information
+ * is stored in a virtal document in a ByteArrayOutputStream
+ * @author Matthias Günter
+ * @since 2006-03-03
+ * @version $Id: TestEmptyProperties.java 353563 2004-06-22 16:16:33Z klute $
+ */
+public class TestMetaDataIPI extends TestCase{
+
+ private ByteArrayOutputStream bout= null; //our store
+ private POIFSFileSystem poifs=null;
+ DirectoryEntry dir = null;
+ DocumentSummaryInformation dsi=null;
+ SummaryInformation si=null;
+
+ /**
+ * Standard constructor
+ * @param s
+ */
+ public TestMetaDataIPI(String s ){
+ super(s);
+ }
+
+ /**
+ * Setup is used to get the document ready. Gets the DocumentSummaryInformation and the
+ * SummaryInformation to reasonable values
+ */
+ public void setUp(){
+ bout=new ByteArrayOutputStream();
+ poifs= new POIFSFileSystem();
+ dir = poifs.getRoot();
+ dsi=null;
+ try
+ {
+ DocumentEntry dsiEntry = (DocumentEntry)
+ dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME);
+ DocumentInputStream dis = new DocumentInputStream(dsiEntry);
+ PropertySet ps = new PropertySet(dis);
+ dis.close();
+ dsi = new DocumentSummaryInformation(ps);
+
+
+ }
+ catch (FileNotFoundException ex)
+ {
+ /* There is no document summary information yet. We have to create a
+ * new one. */
+ dsi = PropertySetFactory.newDocumentSummaryInformation();
+ assertNotNull(dsi);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail();
+ } catch (NoPropertySetStreamException e) {
+ e.printStackTrace();
+ fail();
+ } catch (MarkUnsupportedException e) {
+ e.printStackTrace();
+ fail();
+ } catch (UnexpectedPropertySetTypeException e) {
+ e.printStackTrace();
+ fail();
+ }
+ assertNotNull(dsi);
+ try
+ {
+ DocumentEntry dsiEntry = (DocumentEntry)
+ dir.getEntry(SummaryInformation.DEFAULT_STREAM_NAME);
+ DocumentInputStream dis = new DocumentInputStream(dsiEntry);
+ PropertySet ps = new PropertySet(dis);
+ dis.close();
+ si = new SummaryInformation(ps);
+
+
+ }
+ catch (FileNotFoundException ex)
+ {
+ /* There is no document summary information yet. We have to create a
+ * new one. */
+ si = PropertySetFactory.newSummaryInformation();
+ assertNotNull(si);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail();
+ } catch (NoPropertySetStreamException e) {
+ e.printStackTrace();
+ fail();
+ } catch (MarkUnsupportedException e) {
+ e.printStackTrace();
+ fail();
+ } catch (UnexpectedPropertySetTypeException e) {
+ e.printStackTrace();
+ fail();
+ }
+ assertNotNull(dsi);
+
+
+ }
+
+ /**
+ * Setting a lot of things to null.
+ */
+ public void tearDown(){
+ bout=null;
+ poifs=null;
+ dir=null;
+ dsi=null;
+
+ }
+
+
+ /**
+ * Closes the ByteArrayOutputStream and reads it into a ByteArrayInputStream.
+ * When finished writing information this method is used in the tests to
+ * start reading from the created document and then the see if the results match.
+ *
+ */
+ public void closeAndReOpen(){
+
+ try {
+ dsi.write(dir, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
+ si.write(dir,SummaryInformation.DEFAULT_STREAM_NAME);
+ } catch (WritingNotSupportedException e) {
+ e.printStackTrace();
+ fail();
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail();
+ }
+
+ si=null;
+ dsi=null;
+ try {
+
+ poifs.writeFilesystem(bout);
+ bout.flush();
+
+ } catch (IOException e) {
+
+ e.printStackTrace();
+ fail();
+ }
+
+ InputStream is=new ByteArrayInputStream(bout.toByteArray());
+ assertNotNull(is);
+ POIFSFileSystem poifs=null;
+ try {
+ poifs = new POIFSFileSystem(is);
+ } catch (IOException e) {
+
+ e.printStackTrace();
+ fail();
+ }
+ try {
+ is.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail();
+ }
+ assertNotNull(poifs);
+ /* Read the document summary information. */
+ DirectoryEntry dir = poifs.getRoot();
+
+ try
+ {
+ DocumentEntry dsiEntry = (DocumentEntry)
+ dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME);
+ DocumentInputStream dis = new DocumentInputStream(dsiEntry);
+ PropertySet ps = new PropertySet(dis);
+ dis.close();
+ dsi = new DocumentSummaryInformation(ps);
+ }
+ catch (FileNotFoundException ex)
+ {
+ fail();
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail();
+ } catch (NoPropertySetStreamException e) {
+ e.printStackTrace();
+ fail();
+ } catch (MarkUnsupportedException e) {
+ e.printStackTrace();
+ fail();
+ } catch (UnexpectedPropertySetTypeException e) {
+ e.printStackTrace();
+ fail();
+ }
+ try
+ {
+ DocumentEntry dsiEntry = (DocumentEntry)
+ dir.getEntry(SummaryInformation.DEFAULT_STREAM_NAME);
+ DocumentInputStream dis = new DocumentInputStream(dsiEntry);
+ PropertySet ps = new PropertySet(dis);
+ dis.close();
+ si = new SummaryInformation(ps);
+
+
+ }
+ catch (FileNotFoundException ex)
+ {
+ /* There is no document summary information yet. We have to create a
+ * new one. */
+ si = PropertySetFactory.newSummaryInformation();
+ assertNotNull(si);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail();
+ } catch (NoPropertySetStreamException e) {
+ e.printStackTrace();
+ fail();
+ } catch (MarkUnsupportedException e) {
+ e.printStackTrace();
+ fail();
+ } catch (UnexpectedPropertySetTypeException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ /**
+ * Sets the most important information in DocumentSummaryInformation and Summary Information and rereads it
+ *
+ */
+ public void testOne(){
+
+ //DocumentSummaryInformation
+ dsi.setCompany("xxxCompanyxxx");
+ dsi.setManager("xxxManagerxxx");
+ dsi.setCategory("xxxCategoryxxx");
+
+ //SummaryInformation
+ si.setTitle("xxxTitlexxx");
+ si.setAuthor("xxxAuthorxxx");
+ si.setComments("xxxCommentsxxx");
+ si.setKeywords("xxxKeyWordsxxx");
+ si.setSubject("xxxSubjectxxx");
+
+ //Custom Properties (in DocumentSummaryInformation
+ CustomProperties customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ customProperties = new CustomProperties();
+ }
+
+ /* Insert some custom properties into the container. */
+ customProperties.put("Key1", "Value1");
+ customProperties.put("Schlüssel2", "Wert2");
+ customProperties.put("Sample Integer", new Integer(12345));
+ customProperties.put("Sample Boolean", new Boolean(true));
+ Date date=new Date();
+ customProperties.put("Sample Date", date);
+ customProperties.put("Sample Double", new Double(-1.0001));
+ customProperties.put("Sample Negative Integer", new Integer(-100000));
+
+ dsi.setCustomProperties(customProperties);
+
+ //start reading
+ closeAndReOpen();
+
+ //testing
+ assertNotNull(dsi);
+ assertNotNull(si);
+
+ assertEquals("Category","xxxCategoryxxx",dsi.getCategory());
+ assertEquals("Company","xxxCompanyxxx",dsi.getCompany());
+ assertEquals("Manager","xxxManagerxxx",dsi.getManager());
+
+ assertEquals("","xxxAuthorxxx",si.getAuthor());
+ assertEquals("","xxxTitlexxx",si.getTitle());
+ assertEquals("","xxxCommentsxxx",si.getComments());
+ assertEquals("","xxxKeyWordsxxx",si.getKeywords());
+ assertEquals("","xxxSubjectxxx",si.getSubject());
+
+
+ /* Read the custom properties. If there are no custom properties yet,
+ * the application has to create a new CustomProperties object. It will
+ * serve as a container for custom properties. */
+ customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ fail();
+ }
+
+ /* Insert some custom properties into the container. */
+ String a1=(String) customProperties.get("Key1");
+ assertEquals("Key1","Value1",a1);
+ String a2=(String) customProperties.get("Schlüssel2");
+ assertEquals("Schlüssel2","Wert2",a2);
+ Integer a3=(Integer) customProperties.get("Sample Integer");
+ assertEquals("Sample Number",new Integer(12345),a3);
+ Boolean a4=(Boolean) customProperties.get("Sample Boolean");
+ assertEquals("Sample Boolean",new Boolean(true),a4);
+ Date a5=(Date) customProperties.get("Sample Date");
+ assertEquals("Custom Date:",date,a5);
+
+ Double a6=(Double) customProperties.get("Sample Double");
+ assertEquals("Custom Float",new Double(-1.0001),a6);
+
+ Integer a7=(Integer) customProperties.get("Sample Negative Integer");
+ assertEquals("Neg", new Integer(-100000),a7);
+ }
+
+
+ /**
+ * multiplies a string
+ * @param s Input String
+ * @return the multiplied String
+ */
+ public String elongate(String s){
+ StringBuffer sb=new StringBuffer();
+ for (int i=0;i<10000;i++){
+ sb.append(s);
+ sb.append(" ");
+ }
+ return sb.toString();
+ }
+
+
+
+ /**
+ * Test very long input in each of the fields (approx 30-60KB each)
+ *
+ */
+public void testTwo(){
+
+ String company=elongate("company");
+ String manager=elongate("manager");
+ String category=elongate("category");
+ String title=elongate("title");
+ String author=elongate("author");
+ String comments=elongate("comments");
+ String keywords=elongate("keywords");
+ String subject=elongate("subject");
+ String p1=elongate("p1");
+ String p2=elongate("p2");
+ String k1=elongate("k1");
+ String k2=elongate("k2");
+
+ dsi.setCompany(company);
+ dsi.setManager(manager);
+ dsi.setCategory(category);
+
+ si.setTitle(title);
+ si.setAuthor(author);
+ si.setComments(comments);
+ si.setKeywords(keywords);
+ si.setSubject(subject);
+ CustomProperties customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ customProperties = new CustomProperties();
+ }
+
+ /* Insert some custom properties into the container. */
+ customProperties.put(k1, p1);
+ customProperties.put(k2, p2);
+ customProperties.put("Sample Number", new Integer(12345));
+ customProperties.put("Sample Boolean", new Boolean(true));
+ Date date=new Date();
+ customProperties.put("Sample Date", date);
+
+ dsi.setCustomProperties(customProperties);
+
+
+ closeAndReOpen();
+
+ assertNotNull(dsi);
+ assertNotNull(si);
+ /* Change the category to "POI example". Any former category value will
+ * be lost. If there has been no category yet, it will be created. */
+ assertEquals("Category",category,dsi.getCategory());
+ assertEquals("Company",company,dsi.getCompany());
+ assertEquals("Manager",manager,dsi.getManager());
+
+ assertEquals("",author,si.getAuthor());
+ assertEquals("",title,si.getTitle());
+ assertEquals("",comments,si.getComments());
+ assertEquals("",keywords,si.getKeywords());
+ assertEquals("",subject,si.getSubject());
+
+
+ /* Read the custom properties. If there are no custom properties
+ * yet, the application has to create a new CustomProperties object.
+ * It will serve as a container for custom properties. */
+ customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ fail();
+ }
+
+ /* Insert some custom properties into the container. */
+ String a1=(String) customProperties.get(k1);
+ assertEquals("Key1",p1,a1);
+ String a2=(String) customProperties.get(k2);
+ assertEquals("Schlüssel2",p2,a2);
+ Integer a3=(Integer) customProperties.get("Sample Number");
+ assertEquals("Sample Number",new Integer(12345),a3);
+ Boolean a4=(Boolean) customProperties.get("Sample Boolean");
+ assertEquals("Sample Boolean",new Boolean(true),a4);
+ Date a5=(Date) customProperties.get("Sample Date");
+ assertEquals("Custom Date:",date,a5);
+
+
+ }
+
+
+/**
+ * adds strange characters to the string
+ * @param s Input String
+ * @return the multiplied String
+ */
+public String strangize(String s){
+ StringBuffer sb=new StringBuffer();
+ String[] umlaute= {"ä","ü","ö","Ü","$","Ö","Ü","É","Ö","@","ç","&"};
+ char j=0;
+ Random rand=new Random();
+ for (int i=0;i<5;i++){
+ sb.append(s);
+ sb.append(" ");
+ j=(char) rand.nextInt(220);
+ j+=33;
+ // System.out.println(j);
+ sb.append(">");
+ sb.append(new Character(j));
+ sb.append("=");
+ sb.append(umlaute[rand.nextInt(umlaute.length)]);
+ sb.append("<");
+ }
+
+ return sb.toString();
+}
+
+
+/**
+ * Tests with strange characters in keys and data (Umlaute etc.)
+ *
+ */
+public void testThree(){
+
+ String company=strangize("company");
+ String manager=strangize("manager");
+ String category=strangize("category");
+ String title=strangize("title");
+ String author=strangize("author");
+ String comments=strangize("comments");
+ String keywords=strangize("keywords");
+ String subject=strangize("subject");
+ String p1=strangize("p1");
+ String p2=strangize("p2");
+ String k1=strangize("k1");
+ String k2=strangize("k2");
+
+ dsi.setCompany(company);
+ dsi.setManager(manager);
+ dsi.setCategory(category);
+
+ si.setTitle(title);
+ si.setAuthor(author);
+ si.setComments(comments);
+ si.setKeywords(keywords);
+ si.setSubject(subject);
+ CustomProperties customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ customProperties = new CustomProperties();
+ }
+
+ /* Insert some custom properties into the container. */
+ customProperties.put(k1, p1);
+ customProperties.put(k2, p2);
+ customProperties.put("Sample Number", new Integer(12345));
+ customProperties.put("Sample Boolean", new Boolean(false));
+ Date date=new Date(0);
+ customProperties.put("Sample Date", date);
+
+ dsi.setCustomProperties(customProperties);
+
+
+ closeAndReOpen();
+
+ assertNotNull(dsi);
+ assertNotNull(si);
+ /* Change the category to "POI example". Any former category value will
+ * be lost. If there has been no category yet, it will be created. */
+ assertEquals("Category",category,dsi.getCategory());
+ assertEquals("Company",company,dsi.getCompany());
+ assertEquals("Manager",manager,dsi.getManager());
+
+ assertEquals("",author,si.getAuthor());
+ assertEquals("",title,si.getTitle());
+ assertEquals("",comments,si.getComments());
+ assertEquals("",keywords,si.getKeywords());
+ assertEquals("",subject,si.getSubject());
+
+
+ /* Read the custom properties. If there are no custom properties yet,
+ * the application has to create a new CustomProperties object. It will
+ * serve as a container for custom properties. */
+ customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ fail();
+ }
+
+ /* Insert some custom properties into the container. */
+ // System.out.println(k1);
+ String a1=(String) customProperties.get(k1);
+ assertEquals("Key1",p1,a1);
+ String a2=(String) customProperties.get(k2);
+ assertEquals("Schlüssel2",p2,a2);
+ Integer a3=(Integer) customProperties.get("Sample Number");
+ assertEquals("Sample Number",new Integer(12345),a3);
+ Boolean a4=(Boolean) customProperties.get("Sample Boolean");
+ assertEquals("Sample Boolean",new Boolean(false),a4);
+ Date a5=(Date) customProperties.get("Sample Date");
+ assertEquals("Custom Date:",date,a5);
+
+
+ }
+
+ /**
+ * Iterative testing: writing, reading etc.
+ *
+ */
+ public void testFour(){
+ for (int i=1;i<100;i++){
+ setUp();
+ testThree();
+ tearDown();
+ }
+ }
+
+
+
+ /**
+ * adds strange characters to the string with the adding of unicode characters
+ * @param s Input String
+ * @return the multiplied String
+ */
+ public String strangizeU(String s){
+
+ StringBuffer sb=new StringBuffer();
+ String[] umlaute= {"ä","ü","ö","Ü","$","Ö","Ü","É","Ö","@","ç","&"};
+ char j=0;
+ Random rand=new Random();
+ for (int i=0;i<5;i++){
+ sb.append(s);
+ sb.append(" ");
+ j=(char) rand.nextInt(220);
+ j+=33;
+ // System.out.println(j);
+ sb.append(">");
+ sb.append(new Character(j));
+ sb.append("=");
+ sb.append(umlaute[rand.nextInt(umlaute.length)]);
+ sb.append("<");
+ }
+ sb.append("äöü\uD840\uDC00");
+ return sb.toString();
+ }
+ /**
+ * Unicode test
+ *
+ */
+ public void testUnicode(){
+ String company=strangizeU("company");
+ String manager=strangizeU("manager");
+ String category=strangizeU("category");
+ String title=strangizeU("title");
+ String author=strangizeU("author");
+ String comments=strangizeU("comments");
+ String keywords=strangizeU("keywords");
+ String subject=strangizeU("subject");
+ String p1=strangizeU("p1");
+ String p2=strangizeU("p2");
+ String k1=strangizeU("k1");
+ String k2=strangizeU("k2");
+
+ dsi.setCompany(company);
+ dsi.setManager(manager);
+ dsi.setCategory(category);
+
+ si.setTitle(title);
+ si.setAuthor(author);
+ si.setComments(comments);
+ si.setKeywords(keywords);
+ si.setSubject(subject);
+ CustomProperties customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ customProperties = new CustomProperties();
+ }
+
+ /* Insert some custom properties into the container. */
+ customProperties.put(k1, p1);
+ customProperties.put(k2, p2);
+ customProperties.put("Sample Number", new Integer(12345));
+ customProperties.put("Sample Boolean", new Boolean(true));
+ Date date=new Date();
+ customProperties.put("Sample Date", date);
+
+ dsi.setCustomProperties(customProperties);
+
+
+ closeAndReOpen();
+
+ assertNotNull(dsi);
+ assertNotNull(si);
+ /* Change the category to "POI example". Any former category value will
+ * be lost. If there has been no category yet, it will be created. */
+ assertEquals("Category",category,dsi.getCategory());
+ assertEquals("Company",company,dsi.getCompany());
+ assertEquals("Manager",manager,dsi.getManager());
+
+ assertEquals("",author,si.getAuthor());
+ assertEquals("",title,si.getTitle());
+ assertEquals("",comments,si.getComments());
+ assertEquals("",keywords,si.getKeywords());
+ assertEquals("",subject,si.getSubject());
+
+
+ /* Read the custom properties. If there are no custom properties yet,
+ * the application has to create a new CustomProperties object. It will
+ * serve as a container for custom properties. */
+ customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ fail();
+ }
+
+ /* Insert some custom properties into the container. */
+ // System.out.println(k1);
+ String a1=(String) customProperties.get(k1);
+ assertEquals("Key1",p1,a1);
+ String a2=(String) customProperties.get(k2);
+ assertEquals("Schlüssel2",p2,a2);
+ Integer a3=(Integer) customProperties.get("Sample Number");
+ assertEquals("Sample Number",new Integer(12345),a3);
+ Boolean a4=(Boolean) customProperties.get("Sample Boolean");
+ assertEquals("Sample Boolean",new Boolean(true),a4);
+ Date a5=(Date) customProperties.get("Sample Date");
+ assertEquals("Custom Date:",date,a5);
+
+
+
+ }
+
+
+ /**
+ * Iterative testing of the unicode test
+ *
+ */
+ public void testSix(){
+ for (int i=1;i<100;i++){
+ setUp();
+ testUnicode();
+ tearDown();
+ }
+ }
+
+
+ /**
+ * Tests conversion in custom fields and errors
+ *
+ */
+ public void testConvAndExistance(){
+
+
+ CustomProperties customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ customProperties = new CustomProperties();
+ }
+
+ /* Insert some custom properties into the container. */
+ customProperties.put("int", new Integer(12345));
+ customProperties.put("negint", new Integer(-12345));
+ customProperties.put("long", new Long(12345));
+ customProperties.put("neglong", new Long(-12345));
+ customProperties.put("boolean", new Boolean(true));
+ customProperties.put("string", "a String");
+ //customProperties.put("float", new Float(12345.0)); is not valid
+ //customProperties.put("negfloat", new Float(-12345.1)); is not valid
+ customProperties.put("double", new Double(12345.2));
+ customProperties.put("negdouble", new Double(-12345.3));
+ //customProperties.put("char", new Character('a')); is not valid
+
+ Date date=new Date();
+ customProperties.put("date", date);
+
+ dsi.setCustomProperties(customProperties);
+
+
+ closeAndReOpen();
+
+ assertNotNull(dsi);
+ assertNotNull(si);
+ /* Change the category to "POI example". Any former category value will
+ * be lost. If there has been no category yet, it will be created. */
+ assertNull(dsi.getCategory());
+ assertNull(dsi.getCompany());
+ assertNull(dsi.getManager());
+
+ assertNull(si.getAuthor());
+ assertNull(si.getTitle());
+ assertNull(si.getComments());
+ assertNull(si.getKeywords());
+ assertNull(si.getSubject());
+
+
+ /* Read the custom properties. If there are no custom properties
+ * yet, the application has to create a new CustomProperties object.
+ * It will serve as a container for custom properties. */
+ customProperties = dsi.getCustomProperties();
+ if (customProperties == null){
+ fail();
+ }
+
+ /* Insert some custom properties into the container. */
+
+ Integer a3=(Integer) customProperties.get("int");
+ assertEquals("int",new Integer(12345),a3);
+
+ a3=(Integer) customProperties.get("negint");
+ assertEquals("negint",new Integer(-12345),a3);
+
+ Long al=(Long) customProperties.get("neglong");
+ assertEquals("neglong",new Long(-12345),al);
+
+ al=(Long) customProperties.get("long");
+ assertEquals("long",new Long(12345),al);
+
+ Boolean a4=(Boolean) customProperties.get("boolean");
+ assertEquals("boolean",new Boolean(true),a4);
+
+ Date a5=(Date) customProperties.get("date");
+ assertEquals("Custom Date:",date,a5);
+
+ Double d=(Double) customProperties.get("double");
+ assertEquals("int",new Double(12345.2),d);
+
+ d=(Double) customProperties.get("negdouble");
+ assertEquals("string",new Double(-12345.3),d);
+
+ String s=(String) customProperties.get("string");
+ assertEquals("sring","a String",s);
+
+ Object o=null;
+
+ o=customProperties.get("string");
+ if (!(o instanceof String)){
+ fail();
+ }
+ o=customProperties.get("boolean");
+ if (!(o instanceof Boolean)){
+ fail();
+ }
+
+ o=customProperties.get("int");
+ if (!(o instanceof Integer)){
+ fail();
+ }
+ o=customProperties.get("negint");
+ if (!(o instanceof Integer)){
+ fail();
+ }
+
+ o=customProperties.get("long");
+ if (!(o instanceof Long)){
+ fail();
+ }
+ o=customProperties.get("neglong");
+ if (!(o instanceof Long)){
+ fail();
+ }
+
+ o=customProperties.get("double");
+ if (!(o instanceof Double)){
+ fail();
+ }
+ o=customProperties.get("negdouble");
+ if (!(o instanceof Double)){
+ fail();
+ }
+
+ o=customProperties.get("date");
+ if (!(o instanceof Date)){
+ fail();
+ }
+ }
+
+
+
+}
\ No newline at end of file diff --git a/src/testcases/org/apache/poi/hpsf/basic/TestUnicode.java b/src/testcases/org/apache/poi/hpsf/basic/TestUnicode.java index 9c7a2b47ac..8211545565 100644 --- a/src/testcases/org/apache/poi/hpsf/basic/TestUnicode.java +++ b/src/testcases/org/apache/poi/hpsf/basic/TestUnicode.java @@ -1,6 +1,5 @@ - /* ==================================================================== - Copyright 2002-2004 Apache Software Foundation + Copyright 2002-2006 Apache Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -27,10 +26,12 @@ import junit.framework.Assert; import junit.framework.TestCase; import org.apache.poi.hpsf.Constants; +import org.apache.poi.hpsf.DocumentSummaryInformation; import org.apache.poi.hpsf.HPSFException; import org.apache.poi.hpsf.PropertySet; import org.apache.poi.hpsf.PropertySetFactory; import org.apache.poi.hpsf.Section; +import org.apache.poi.hpsf.SummaryInformation; @@ -102,7 +103,7 @@ public class TestUnicode extends TestCase Assert.assertEquals(s.getProperty(1), new Integer(Constants.CP_UTF16)); Assert.assertEquals(s.getProperty(2), - new Long(4198897018L)); + new Integer(-96070278)); Assert.assertEquals(s.getProperty(3), "MCon_Info zu Office bei Schreiner"); Assert.assertEquals(s.getProperty(4), diff --git a/src/testcases/org/apache/poi/hpsf/basic/TestWrite.java b/src/testcases/org/apache/poi/hpsf/basic/TestWrite.java index 3fa12d83f6..5880328f46 100644 --- a/src/testcases/org/apache/poi/hpsf/basic/TestWrite.java +++ b/src/testcases/org/apache/poi/hpsf/basic/TestWrite.java @@ -1,5 +1,5 @@ /* ==================================================================== - Copyright 2002-2004 Apache Software Foundation + Copyright 2002-2006 Apache Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -13,7 +13,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.hpsf.basic; @@ -124,11 +123,8 @@ public class TestWrite extends TestCase * in.</p> * * @exception IOException if an I/O exception occurs - * @exception UnsupportedVariantTypeException if HPSF does not yet support - * a variant type to be written */ - public void testNoFormatID() - throws IOException, UnsupportedVariantTypeException + public void testNoFormatID() throws IOException { final String dataDirName = System.getProperty("HPSF.testdata.path"); final File dataDir = new File(dataDirName); @@ -409,10 +405,19 @@ public class TestWrite extends TestCase check(Variant.VT_CF, new byte[]{0, 1, 2, 3, 4, 5}, codepage); check(Variant.VT_CF, new byte[]{0, 1, 2, 3, 4, 5, 6}, codepage); check(Variant.VT_CF, new byte[]{0, 1, 2, 3, 4, 5, 6, 7}, codepage); - check(Variant.VT_I2, new Integer(27), codepage); - check(Variant.VT_I4, new Long(28), codepage); + check(Variant.VT_I4, new Integer(27), codepage); + check(Variant.VT_I8, new Long(28), codepage); check(Variant.VT_R8, new Double(29.0), codepage); + check(Variant.VT_I4, new Integer(-27), codepage); + check(Variant.VT_I8, new Long(-28), codepage); + check(Variant.VT_R8, new Double(-29.0), codepage); check(Variant.VT_FILETIME, new Date(), codepage); + check(Variant.VT_I4, new Integer(Integer.MAX_VALUE), codepage); + check(Variant.VT_I4, new Integer(Integer.MIN_VALUE), codepage); + check(Variant.VT_I8, new Long(Long.MAX_VALUE), codepage); + check(Variant.VT_I8, new Long(Long.MIN_VALUE), codepage); + check(Variant.VT_R8, new Double(Double.MAX_VALUE), codepage); + check(Variant.VT_R8, new Double(Double.MIN_VALUE), codepage); check(Variant.VT_LPSTR, "", codepage); @@ -602,8 +607,11 @@ public class TestWrite extends TestCase * * @param variantType The property's variant type. * @param value The property's value. + * @param codepage The codepage to use for writing and reading. * @throws UnsupportedVariantTypeException if the variant is not supported. * @throws IOException if an I/O exception occurs. + * @throws ReadingNotSupportedException + * @throws UnsupportedEncodingException */ private void check(final long variantType, final Object value, final int codepage) @@ -779,7 +787,7 @@ public class TestWrite extends TestCase m.put(new Long(2), "String 2"); m.put(new Long(3), "String 3"); s.setDictionary(m); - s.setFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID); + s.setFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID[0]); int codepage = Constants.CP_UNICODE; s.setProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, new Integer(codepage)); @@ -831,7 +839,7 @@ public class TestWrite extends TestCase m.put(new Long(2), "String 2"); m.put(new Long(3), "String 3"); s.setDictionary(m); - s.setFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID); + s.setFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID[0]); int codepage = 12345; s.setProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, new Integer(codepage)); @@ -902,8 +910,11 @@ public class TestWrite extends TestCase /** * <p>In order to execute tests with characters beyond US-ASCII, this - * method checks whether the application has is runing in an environment + * method checks whether the application is runing in an environment * where the default character set is 16-bit-capable.</p> + * + * @return <code>true</code> if the default character set is 16-bit-capable, + * else <code>false</code>. */ private boolean hasProperDefaultCharset() { @@ -916,6 +927,9 @@ public class TestWrite extends TestCase /** * <p>Runs the test cases stand-alone.</p> + * + * @param args The command-line parameters. + * @throws Throwable if anything goes wrong. */ public static void main(final String[] args) throws Throwable { diff --git a/src/testcases/org/apache/poi/hpsf/basic/TestWriteWellKnown.java b/src/testcases/org/apache/poi/hpsf/basic/TestWriteWellKnown.java new file mode 100644 index 0000000000..db185109b9 --- /dev/null +++ b/src/testcases/org/apache/poi/hpsf/basic/TestWriteWellKnown.java @@ -0,0 +1,763 @@ +/* ==================================================================== + Copyright 2002-2006 Apache Software Foundation + + Licensed 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.hpsf.basic; + +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import junit.framework.TestCase; + +import org.apache.poi.hpsf.CustomProperties; +import org.apache.poi.hpsf.CustomProperty; +import org.apache.poi.hpsf.DocumentSummaryInformation; +import org.apache.poi.hpsf.MarkUnsupportedException; +import org.apache.poi.hpsf.MutableProperty; +import org.apache.poi.hpsf.MutableSection; +import org.apache.poi.hpsf.NoPropertySetStreamException; +import org.apache.poi.hpsf.PropertySet; +import org.apache.poi.hpsf.PropertySetFactory; +import org.apache.poi.hpsf.SummaryInformation; +import org.apache.poi.hpsf.UnexpectedPropertySetTypeException; +import org.apache.poi.hpsf.Variant; +import org.apache.poi.hpsf.VariantSupport; +import org.apache.poi.hpsf.WritingNotSupportedException; +import org.apache.poi.hpsf.wellknown.SectionIDMap; +import org.apache.poi.poifs.filesystem.DirectoryEntry; +import org.apache.poi.poifs.filesystem.DocumentEntry; +import org.apache.poi.poifs.filesystem.DocumentInputStream; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; + + + +/** + * <p>Tests HPSF's high-level writing functionality for the well-known property + * set "SummaryInformation" and "DocumentSummaryInformation".</p> + * + * @author Rainer Klute + * <a href="mailto:klute@rainer-klute.de">klute@rainer-klute.de</a> + * @since 2006-02-01 + * @version $Id$ + */ +public class TestWriteWellKnown extends TestCase +{ + + private static final String POI_FS = "TestWriteWellKnown.doc"; + + /** + * <p>Constructor</p> + * + * @param name the test case's name + */ + public TestWriteWellKnown(final String name) + { + super(name); + } + + + + /** + * @see TestCase#setUp() + */ + public void setUp() + { + VariantSupport.setLogUnsupportedTypes(false); + } + + + + /** + * <p>This test method checks whether DocumentSummary information streams + * can be read. This is done by opening all "Test*" files in the directrory + * pointed to by the "HPSF.testdata.path" system property, trying to extract + * the document summary information stream in the root directory and calling + * its get... methods.</p> + * @throws IOException + * @throws FileNotFoundException + * @throws MarkUnsupportedException + * @throws NoPropertySetStreamException + * @throws UnexpectedPropertySetTypeException + */ + public void testReadDocumentSummaryInformation() + throws FileNotFoundException, IOException, + NoPropertySetStreamException, MarkUnsupportedException, + UnexpectedPropertySetTypeException + { + final String dataDirName = System.getProperty("HPSF.testdata.path"); + final File dataDir = new File(dataDirName); + final File[] docs = dataDir.listFiles(new FileFilter() + { + public boolean accept(final File file) + { + return file.isFile() && file.getName().startsWith("Test"); + }}); + for (int i = 0; i < docs.length; i++) + { + final File doc = docs[i]; + System.out.println("Reading file " + doc); + + /* Read a test document <em>doc</em> into a POI filesystem. */ + final POIFSFileSystem poifs = new POIFSFileSystem(new FileInputStream(doc)); + final DirectoryEntry dir = poifs.getRoot(); + DocumentEntry dsiEntry = null; + try + { + dsiEntry = (DocumentEntry) dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME); + } + catch (FileNotFoundException ex) + { + /* + * A missing document summary information stream is not an error + * and therefore silently ignored here. + */ + } + + /* + * If there is a document summry information stream, read it from + * the POI filesystem. + */ + if (dsiEntry != null) + { + final DocumentInputStream dis = new DocumentInputStream(dsiEntry); + final PropertySet ps = new PropertySet(dis); + final DocumentSummaryInformation dsi = new DocumentSummaryInformation(ps); + + /* Execute the get... methods. */ + dsi.getByteCount(); + dsi.getByteOrder(); + dsi.getCategory(); + dsi.getCompany(); + dsi.getCustomProperties(); + // FIXME dsi.getDocparts(); + // FIXME dsi.getHeadingPair(); + dsi.getHiddenCount(); + dsi.getLineCount(); + dsi.getLinksDirty(); + dsi.getManager(); + dsi.getMMClipCount(); + dsi.getNoteCount(); + dsi.getParCount(); + dsi.getPresentationFormat(); + dsi.getScale(); + dsi.getSlideCount(); + } + } + } + + + /** + * <p>This test method test the writing of properties in the well-known + * property set streams "SummaryInformation" and + * "DocumentSummaryInformation" by performing the following steps:</p> + * + * <ol> + * + * <li><p>Read a test document <em>doc1</em> into a POI filesystem.</p></li> + * + * <li><p>Read the summary information stream and the document summary + * information stream from the POI filesystem.</p></li> + * + * <li><p>Write all properties supported by HPSF to the summary + * information (e.g. author, edit date, application name) and to the + * document summary information (e.g. company, manager).</p></li> + * + * <li><p>Write the summary information stream and the document summary + * information stream to the POI filesystem.</p></li> + * + * <li><p>Write the POI filesystem to a (temporary) file <em>doc2</em> + * and close the latter.</p></li> + * + * <li><p>Open <em>doc2</em> for reading and check summary information + * and document summary information. All properties written before must be + * found in the property streams of <em>doc2</em> and have the correct + * values.</p></li> + * + * <li><p>Remove all properties supported by HPSF from the summary + * information (e.g. author, edit date, application name) and from the + * document summary information (e.g. company, manager).</p></li> + * + * <li><p>Write the summary information stream and the document summary + * information stream to the POI filesystem.</p></li> + * + * <li><p>Write the POI filesystem to a (temporary) file <em>doc3</em> + * and close the latter.</p></li> + * + * <li><p>Open <em>doc3</em> for reading and check summary information + * and document summary information. All properties removed before must not + * be found in the property streams of <em>doc3</em>.</p></li> </ol> + * + * @throws IOException if some I/O error occurred. + * @throws MarkUnsupportedException + * @throws NoPropertySetStreamException + * @throws UnexpectedPropertySetTypeException + * @throws WritingNotSupportedException + */ + public void testWriteWellKnown() throws IOException, + NoPropertySetStreamException, MarkUnsupportedException, + UnexpectedPropertySetTypeException, WritingNotSupportedException + { + final String dataDirName = System.getProperty("HPSF.testdata.path"); + final File dataDir = new File(dataDirName); + final File doc1 = new File(dataDir, POI_FS); + + /* Read a test document <em>doc1</em> into a POI filesystem. */ + POIFSFileSystem poifs = new POIFSFileSystem(new FileInputStream(doc1)); + DirectoryEntry dir = poifs.getRoot(); + DocumentEntry siEntry = (DocumentEntry) dir.getEntry(SummaryInformation.DEFAULT_STREAM_NAME); + DocumentEntry dsiEntry = (DocumentEntry) dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME); + + /* + * Read the summary information stream and the document summary + * information stream from the POI filesystem. + * + * Please note that the result consists of SummaryInformation and + * DocumentSummaryInformation instances which are in memory only. To + * make them permanent they have to be written to a POI filesystem + * explicitly (overwriting the former contents). Then the POI filesystem + * should be saved to a file. + */ + DocumentInputStream dis = new DocumentInputStream(siEntry); + PropertySet ps = new PropertySet(dis); + SummaryInformation si = new SummaryInformation(ps); + dis = new DocumentInputStream(dsiEntry); + ps = new PropertySet(dis); + DocumentSummaryInformation dsi = new DocumentSummaryInformation(ps); + + /* + * Write all properties supported by HPSF to the summary information + * (e.g. author, edit date, application name) and to the document + * summary information (e.g. company, manager). + */ + Calendar cal = new GregorianCalendar(); + cal.set(2000, 6, 6, 6, 6, 6); + final long time1 = cal.getTimeInMillis(); + cal.set(2001, 7, 7, 7, 7, 7); + final long time2 = cal.getTimeInMillis(); + cal.set(2002, 8, 8, 8, 8, 8); + final long time3 = cal.getTimeInMillis(); + + int nr = 4711; + final String P_APPLICATION_NAME = "ApplicationName"; + final String P_AUTHOR = "Author"; + final int P_CHAR_COUNT = ++nr; + final String P_COMMENTS = "Comments"; + final Date P_CREATE_DATE_TIME = new Date(time1); + final long P_EDIT_TIME = ++nr * 1000 * 10; + final String P_KEYWORDS = "Keywords"; + final String P_LAST_AUTHOR = "LastAuthor"; + final Date P_LAST_PRINTED = new Date(time2); + final Date P_LAST_SAVE_DATE_TIME = new Date(time3); + final int P_PAGE_COUNT = ++nr; + final String P_REV_NUMBER = "RevNumber"; + final int P_SECURITY = 1; + final String P_SUBJECT = "Subject"; + final String P_TEMPLATE = "Template"; + // FIXME (byte array properties not yet implemented): final byte[] P_THUMBNAIL = new byte[123]; + final String P_TITLE = "Title"; + final int P_WORD_COUNT = ++nr; + + final int P_BYTE_COUNT = ++nr; + final String P_CATEGORY = "Category"; + final String P_COMPANY = "Company"; + // FIXME (byte array properties not yet implemented): final byte[] P_DOCPARTS = new byte[123]; + // FIXME (byte array properties not yet implemented): final byte[] P_HEADING_PAIR = new byte[123]; + final int P_HIDDEN_COUNT = ++nr; + final int P_LINE_COUNT = ++nr; + final boolean P_LINKS_DIRTY = true; + final String P_MANAGER = "Manager"; + final int P_MM_CLIP_COUNT = ++nr; + final int P_NOTE_COUNT = ++nr; + final int P_PAR_COUNT = ++nr; + final String P_PRESENTATION_FORMAT = "PresentationFormat"; + final boolean P_SCALE = false; + final int P_SLIDE_COUNT = ++nr; + final Date now = new Date(); + + final Integer POSITIVE_INTEGER = new Integer(2222); + final Long POSITIVE_LONG = new Long(3333); + final Double POSITIVE_DOUBLE = new Double(4444); + final Integer NEGATIVE_INTEGER = new Integer(2222); + final Long NEGATIVE_LONG = new Long(3333); + final Double NEGATIVE_DOUBLE = new Double(4444); + + final Integer MAX_INTEGER = new Integer(Integer.MAX_VALUE); + final Integer MIN_INTEGER = new Integer(Integer.MIN_VALUE); + final Long MAX_LONG = new Long(Long.MAX_VALUE); + final Long MIN_LONG = new Long(Long.MIN_VALUE); + final Double MAX_DOUBLE = new Double(Double.MAX_VALUE); + final Double MIN_DOUBLE = new Double(Double.MIN_VALUE); + + si.setApplicationName(P_APPLICATION_NAME); + si.setAuthor(P_AUTHOR); + si.setCharCount(P_CHAR_COUNT); + si.setComments(P_COMMENTS); + si.setCreateDateTime(P_CREATE_DATE_TIME); + si.setEditTime(P_EDIT_TIME); + si.setKeywords(P_KEYWORDS); + si.setLastAuthor(P_LAST_AUTHOR); + si.setLastPrinted(P_LAST_PRINTED); + si.setLastSaveDateTime(P_LAST_SAVE_DATE_TIME); + si.setPageCount(P_PAGE_COUNT); + si.setRevNumber(P_REV_NUMBER); + si.setSecurity(P_SECURITY); + si.setSubject(P_SUBJECT); + si.setTemplate(P_TEMPLATE); + // FIXME (byte array properties not yet implemented): si.setThumbnail(P_THUMBNAIL); + si.setTitle(P_TITLE); + si.setWordCount(P_WORD_COUNT); + + dsi.setByteCount(P_BYTE_COUNT); + dsi.setCategory(P_CATEGORY); + dsi.setCompany(P_COMPANY); + // FIXME (byte array properties not yet implemented): dsi.setDocparts(P_DOCPARTS); + // FIXME (byte array properties not yet implemented): dsi.setHeadingPair(P_HEADING_PAIR); + dsi.setHiddenCount(P_HIDDEN_COUNT); + dsi.setLineCount(P_LINE_COUNT); + dsi.setLinksDirty(P_LINKS_DIRTY); + dsi.setManager(P_MANAGER); + dsi.setMMClipCount(P_MM_CLIP_COUNT); + dsi.setNoteCount(P_NOTE_COUNT); + dsi.setParCount(P_PAR_COUNT); + dsi.setPresentationFormat(P_PRESENTATION_FORMAT); + dsi.setScale(P_SCALE); + dsi.setSlideCount(P_SLIDE_COUNT); + + CustomProperties customProperties = dsi.getCustomProperties(); + if (customProperties == null) + customProperties = new CustomProperties(); + customProperties.put("Schlüssel ä", "Wert ä"); + customProperties.put("Schlüssel äö", "Wert äö"); + customProperties.put("Schlüssel äöü", "Wert äöü"); + customProperties.put("Schlüssel äöüß", "Wert äöüß"); + customProperties.put("positive_Integer", POSITIVE_INTEGER); + customProperties.put("positive_Long", POSITIVE_LONG); + customProperties.put("positive_Double", POSITIVE_DOUBLE); + customProperties.put("negative_Integer", NEGATIVE_INTEGER); + customProperties.put("negative_Long", NEGATIVE_LONG); + customProperties.put("negative_Double", NEGATIVE_DOUBLE); + customProperties.put("Boolean", new Boolean(true)); + customProperties.put("Date", now); + customProperties.put("max_Integer", MAX_INTEGER); + customProperties.put("min_Integer", MIN_INTEGER); + customProperties.put("max_Long", MAX_LONG); + customProperties.put("min_Long", MIN_LONG); + customProperties.put("max_Double", MAX_DOUBLE); + customProperties.put("min_Double", MIN_DOUBLE); + dsi.setCustomProperties(customProperties); + + /* Write the summary information stream and the document summary + * information stream to the POI filesystem. */ + si.write(dir, siEntry.getName()); + dsi.write(dir, dsiEntry.getName()); + + /* Write the POI filesystem to a (temporary) file <em>doc2</em> + * and close the latter. */ + final File doc2 = File.createTempFile("POI_HPSF_Test.", ".tmp"); + doc2.deleteOnExit(); + OutputStream out = new FileOutputStream(doc2); + poifs.writeFilesystem(out); + out.close(); + + /* + * Open <em>doc2</em> for reading and check summary information and + * document summary information. All properties written before must be + * found in the property streams of <em>doc2</em> and have the correct + * values. + */ + poifs = new POIFSFileSystem(new FileInputStream(doc2)); + dir = poifs.getRoot(); + siEntry = (DocumentEntry) dir.getEntry(SummaryInformation.DEFAULT_STREAM_NAME); + dsiEntry = (DocumentEntry) dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME); + + dis = new DocumentInputStream(siEntry); + ps = new PropertySet(dis); + si = new SummaryInformation(ps); + dis = new DocumentInputStream(dsiEntry); + ps = new PropertySet(dis); + dsi = new DocumentSummaryInformation(ps); + + assertEquals(P_APPLICATION_NAME, si.getApplicationName()); + assertEquals(P_AUTHOR, si.getAuthor()); + assertEquals(P_CHAR_COUNT, si.getCharCount()); + assertEquals(P_COMMENTS, si.getComments()); + assertEquals(P_CREATE_DATE_TIME, si.getCreateDateTime()); + assertEquals(P_EDIT_TIME, si.getEditTime()); + assertEquals(P_KEYWORDS, si.getKeywords()); + assertEquals(P_LAST_AUTHOR, si.getLastAuthor()); + assertEquals(P_LAST_PRINTED, si.getLastPrinted()); + assertEquals(P_LAST_SAVE_DATE_TIME, si.getLastSaveDateTime()); + assertEquals(P_PAGE_COUNT, si.getPageCount()); + assertEquals(P_REV_NUMBER, si.getRevNumber()); + assertEquals(P_SECURITY, si.getSecurity()); + assertEquals(P_SUBJECT, si.getSubject()); + assertEquals(P_TEMPLATE, si.getTemplate()); + // FIXME (byte array properties not yet implemented): assertEquals(P_THUMBNAIL, si.getThumbnail()); + assertEquals(P_TITLE, si.getTitle()); + assertEquals(P_WORD_COUNT, si.getWordCount()); + + assertEquals(P_BYTE_COUNT, dsi.getByteCount()); + assertEquals(P_CATEGORY, dsi.getCategory()); + assertEquals(P_COMPANY, dsi.getCompany()); + // FIXME (byte array properties not yet implemented): assertEquals(P_, dsi.getDocparts()); + // FIXME (byte array properties not yet implemented): assertEquals(P_, dsi.getHeadingPair()); + assertEquals(P_HIDDEN_COUNT, dsi.getHiddenCount()); + assertEquals(P_LINE_COUNT, dsi.getLineCount()); + assertEquals(P_LINKS_DIRTY, dsi.getLinksDirty()); + assertEquals(P_MANAGER, dsi.getManager()); + assertEquals(P_MM_CLIP_COUNT, dsi.getMMClipCount()); + assertEquals(P_NOTE_COUNT, dsi.getNoteCount()); + assertEquals(P_PAR_COUNT, dsi.getParCount()); + assertEquals(P_PRESENTATION_FORMAT, dsi.getPresentationFormat()); + assertEquals(P_SCALE, dsi.getScale()); + assertEquals(P_SLIDE_COUNT, dsi.getSlideCount()); + + final CustomProperties cps = dsi.getCustomProperties(); + assertEquals(customProperties, cps); + assertNull(cps.get("No value available")); + assertEquals("Wert ä", cps.get("Schlüssel ä")); + assertEquals("Wert äö", cps.get("Schlüssel äö")); + assertEquals("Wert äöü", cps.get("Schlüssel äöü")); + assertEquals("Wert äöüß", cps.get("Schlüssel äöüß")); + assertEquals(POSITIVE_INTEGER, cps.get("positive_Integer")); + assertEquals(POSITIVE_LONG, cps.get("positive_Long")); + assertEquals(POSITIVE_DOUBLE, cps.get("positive_Double")); + assertEquals(NEGATIVE_INTEGER, cps.get("negative_Integer")); + assertEquals(NEGATIVE_LONG, cps.get("negative_Long")); + assertEquals(NEGATIVE_DOUBLE, cps.get("negative_Double")); + assertEquals(new Boolean(true), cps.get("Boolean")); + assertEquals(now, cps.get("Date")); + assertEquals(MAX_INTEGER, cps.get("max_Integer")); + assertEquals(MIN_INTEGER, cps.get("min_Integer")); + assertEquals(MAX_LONG, cps.get("max_Long")); + assertEquals(MIN_LONG, cps.get("min_Long")); + assertEquals(MAX_DOUBLE, cps.get("max_Double")); + assertEquals(MIN_DOUBLE, cps.get("min_Double")); + + /* Remove all properties supported by HPSF from the summary + * information (e.g. author, edit date, application name) and from the + * document summary information (e.g. company, manager). */ + si.removeApplicationName(); + si.removeAuthor(); + si.removeCharCount(); + si.removeComments(); + si.removeCreateDateTime(); + si.removeEditTime(); + si.removeKeywords(); + si.removeLastAuthor(); + si.removeLastPrinted(); + si.removeLastSaveDateTime(); + si.removePageCount(); + si.removeRevNumber(); + si.removeSecurity(); + si.removeSubject(); + si.removeTemplate(); + si.removeThumbnail(); + si.removeTitle(); + si.removeWordCount(); + + dsi.removeByteCount(); + dsi.removeCategory(); + dsi.removeCompany(); + dsi.removeCustomProperties(); + dsi.removeDocparts(); + dsi.removeHeadingPair(); + dsi.removeHiddenCount(); + dsi.removeLineCount(); + dsi.removeLinksDirty(); + dsi.removeManager(); + dsi.removeMMClipCount(); + dsi.removeNoteCount(); + dsi.removeParCount(); + dsi.removePresentationFormat(); + dsi.removeScale(); + dsi.removeSlideCount(); + + /* + * <li><p>Write the summary information stream and the document summary + * information stream to the POI filesystem. */ + si.write(dir, siEntry.getName()); + dsi.write(dir, dsiEntry.getName()); + + /* + * <li><p>Write the POI filesystem to a (temporary) file <em>doc3</em> + * and close the latter. */ + final File doc3 = File.createTempFile("POI_HPSF_Test.", ".tmp"); + doc3.deleteOnExit(); + out = new FileOutputStream(doc3); + poifs.writeFilesystem(out); + out.close(); + + /* + * Open <em>doc3</em> for reading and check summary information + * and document summary information. All properties removed before must not + * be found in the property streams of <em>doc3</em>. + */ + poifs = new POIFSFileSystem(new FileInputStream(doc3)); + dir = poifs.getRoot(); + siEntry = (DocumentEntry) dir.getEntry(SummaryInformation.DEFAULT_STREAM_NAME); + dsiEntry = (DocumentEntry) dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME); + + dis = new DocumentInputStream(siEntry); + ps = new PropertySet(dis); + si = new SummaryInformation(ps); + dis = new DocumentInputStream(dsiEntry); + ps = new PropertySet(dis); + dsi = new DocumentSummaryInformation(ps); + + assertEquals(null, si.getApplicationName()); + assertEquals(null, si.getAuthor()); + assertEquals(0, si.getCharCount()); + assertTrue(si.wasNull()); + assertEquals(null, si.getComments()); + assertEquals(null, si.getCreateDateTime()); + assertEquals(0, si.getEditTime()); + assertTrue(si.wasNull()); + assertEquals(null, si.getKeywords()); + assertEquals(null, si.getLastAuthor()); + assertEquals(null, si.getLastPrinted()); + assertEquals(null, si.getLastSaveDateTime()); + assertEquals(0, si.getPageCount()); + assertTrue(si.wasNull()); + assertEquals(null, si.getRevNumber()); + assertEquals(0, si.getSecurity()); + assertTrue(si.wasNull()); + assertEquals(null, si.getSubject()); + assertEquals(null, si.getTemplate()); + assertEquals(null, si.getThumbnail()); + assertEquals(null, si.getTitle()); + assertEquals(0, si.getWordCount()); + assertTrue(si.wasNull()); + + assertEquals(0, dsi.getByteCount()); + assertTrue(dsi.wasNull()); + assertEquals(null, dsi.getCategory()); + assertEquals(null, dsi.getCustomProperties()); + // FIXME (byte array properties not yet implemented): assertEquals(null, dsi.getDocparts()); + // FIXME (byte array properties not yet implemented): assertEquals(null, dsi.getHeadingPair()); + assertEquals(0, dsi.getHiddenCount()); + assertTrue(dsi.wasNull()); + assertEquals(0, dsi.getLineCount()); + assertTrue(dsi.wasNull()); + assertEquals(false, dsi.getLinksDirty()); + assertTrue(dsi.wasNull()); + assertEquals(null, dsi.getManager()); + assertEquals(0, dsi.getMMClipCount()); + assertTrue(dsi.wasNull()); + assertEquals(0, dsi.getNoteCount()); + assertTrue(dsi.wasNull()); + assertEquals(0, dsi.getParCount()); + assertTrue(dsi.wasNull()); + assertEquals(null, dsi.getPresentationFormat()); + assertEquals(false, dsi.getScale()); + assertTrue(dsi.wasNull()); + assertEquals(0, dsi.getSlideCount()); + assertTrue(dsi.wasNull()); + } + + + + /** + * <p>Tests the simplified custom properties by reading them from the + * available test files.</p> + * + * @throws Throwable if anything goes wrong. + */ + public void testReadCustomPropertiesFromFiles() throws Throwable + { + final AllDataFilesTester.TestTask task = new AllDataFilesTester.TestTask() + { + public void runTest(final File file) throws FileNotFoundException, + IOException, NoPropertySetStreamException, + MarkUnsupportedException, + UnexpectedPropertySetTypeException + { + /* Read a test document <em>doc</em> into a POI filesystem. */ + final POIFSFileSystem poifs = new POIFSFileSystem(new FileInputStream(file)); + final DirectoryEntry dir = poifs.getRoot(); + DocumentEntry dsiEntry = null; + try + { + dsiEntry = (DocumentEntry) dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME); + } + catch (FileNotFoundException ex) + { + /* + * A missing document summary information stream is not an error + * and therefore silently ignored here. + */ + } + + /* + * If there is a document summry information stream, read it from + * the POI filesystem, else create a new one. + */ + DocumentSummaryInformation dsi; + if (dsiEntry != null) + { + final DocumentInputStream dis = new DocumentInputStream(dsiEntry); + final PropertySet ps = new PropertySet(dis); + dsi = new DocumentSummaryInformation(ps); + } + else + dsi = PropertySetFactory.newDocumentSummaryInformation(); + final CustomProperties cps = dsi.getCustomProperties(); + + if (cps == null) + /* The document does not have custom properties. */ + return; + + for (final Iterator i = cps.entrySet().iterator(); i.hasNext();) + { + final Map.Entry e = (Entry) i.next(); + final CustomProperty cp = (CustomProperty) e.getValue(); + cp.getName(); + cp.getValue(); + } + } + }; + + final String dataDirName = System.getProperty("HPSF.testdata.path"); + final File dataDir = new File(dataDirName); + final File[] docs = dataDir.listFiles(new FileFilter() + { + public boolean accept(final File file) + { + return file.isFile() && file.getName().startsWith("Test"); + } + }); + + for (int i = 0; i < docs.length; i++) + { + task.runTest(docs[i]); + } + } + + + + /** + * <p>Tests basic custom property features.</p> + */ + public void testCustomerProperties() + { + final String KEY = "Schlüssel ä"; + final String VALUE_1 = "Wert 1"; + final String VALUE_2 = "Wert 2"; + + CustomProperty cp; + CustomProperties cps = new CustomProperties(); + assertEquals(0, cps.size()); + + /* After adding a custom property the size must be 1 and it must be + * possible to extract the custom property from the map. */ + cps.put(KEY, VALUE_1); + assertEquals(1, cps.size()); + Object v1 = cps.get(KEY); + assertEquals(VALUE_1, v1); + + /* After adding a custom property with the same name the size must still + * be one. */ + cps.put(KEY, VALUE_2); + assertEquals(1, cps.size()); + Object v2 = cps.get(KEY); + assertEquals(VALUE_2, v2); + + /* Removing the custom property must return the remove property and + * reduce the size to 0. */ + cp = (CustomProperty) cps.remove(KEY); + assertEquals(KEY, cp.getName()); + assertEquals(VALUE_2, cp.getValue()); + assertEquals(0, cps.size()); + } + + + + /** + * <p>Tests reading custom properties from a section including reading + * custom properties which are not pure.</p> + */ + public void testGetCustomerProperties() + { + final int ID_1 = 2; + final int ID_2 = 3; + final String NAME_1 = "Schlüssel ä"; + final String VALUE_1 = "Wert 1"; + final Map dictionary = new HashMap(); + + DocumentSummaryInformation dsi = PropertySetFactory.newDocumentSummaryInformation(); + CustomProperties cps; + MutableSection s; + + /* A document summary information set stream by default does have custom properties. */ + cps = dsi.getCustomProperties(); + assertEquals(null, cps); + + /* Test an empty custom properties set. */ + s = new MutableSection(); + s.setFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID[1]); + // s.setCodepage(Constants.CP_UNICODE); + dsi.addSection(s); + cps = dsi.getCustomProperties(); + assertEquals(0, cps.size()); + + /* Add a custom property. */ + MutableProperty p = new MutableProperty(); + p.setID(ID_1); + p.setType(Variant.VT_LPWSTR); + p.setValue(VALUE_1); + s.setProperty(p); + dictionary.put(new Long(ID_1), NAME_1); + s.setDictionary(dictionary); + cps = dsi.getCustomProperties(); + assertEquals(1, cps.size()); + assertTrue(cps.isPure()); + + /* Add another custom property. */ + s.setProperty(ID_2, Variant.VT_LPWSTR, VALUE_1); + dictionary.put(new Long(ID_2), NAME_1); + s.setDictionary(dictionary); + cps = dsi.getCustomProperties(); + assertEquals(1, cps.size()); + assertFalse(cps.isPure()); + } + + + + /** + * <p>Runs the test cases stand-alone.</p> + * + * @param args The command-line parameters. + * @throws Throwable if anything goes wrong. + */ + public static void main(final String[] args) throws Throwable + { + System.setProperty("HPSF.testdata.path", + "./src/testcases/org/apache/poi/hpsf/data"); + junit.textui.TestRunner.run(TestWriteWellKnown.class); + } + +} diff --git a/src/testcases/org/apache/poi/hpsf/data/TestCorel.shw b/src/testcases/org/apache/poi/hpsf/data/TestCorel.shw Binary files differindex e0af1945e8..e0af1945e8 100755..100644 --- a/src/testcases/org/apache/poi/hpsf/data/TestCorel.shw +++ b/src/testcases/org/apache/poi/hpsf/data/TestCorel.shw diff --git a/src/testcases/org/apache/poi/hpsf/data/TestGermanWord90.doc b/src/testcases/org/apache/poi/hpsf/data/TestGermanWord90.doc Binary files differindex 63bbed326e..63bbed326e 100755..100644 --- a/src/testcases/org/apache/poi/hpsf/data/TestGermanWord90.doc +++ b/src/testcases/org/apache/poi/hpsf/data/TestGermanWord90.doc diff --git a/src/testcases/org/apache/poi/hpsf/data/TestRobert_Flaherty.doc b/src/testcases/org/apache/poi/hpsf/data/TestRobert_Flaherty.doc Binary files differindex ee3e14296b..ee3e14296b 100755..100644 --- a/src/testcases/org/apache/poi/hpsf/data/TestRobert_Flaherty.doc +++ b/src/testcases/org/apache/poi/hpsf/data/TestRobert_Flaherty.doc diff --git a/src/testcases/org/apache/poi/hpsf/data/TestWriteWellKnown.doc b/src/testcases/org/apache/poi/hpsf/data/TestWriteWellKnown.doc Binary files differnew file mode 100644 index 0000000000..d3a0433041 --- /dev/null +++ b/src/testcases/org/apache/poi/hpsf/data/TestWriteWellKnown.doc |