diff --git a/build.xml b/build.xml index 343075e60..335afe370 100644 --- a/build.xml +++ b/build.xml @@ -390,6 +390,8 @@ value="${xlayout.source.test.dir}/org/apache/poi/util/data"/> + diff --git a/src/java/org/apache/poi/hpsf/Property.java b/src/java/org/apache/poi/hpsf/Property.java index 073ac791d..13c6917c6 100644 --- a/src/java/org/apache/poi/hpsf/Property.java +++ b/src/java/org/apache/poi/hpsf/Property.java @@ -75,15 +75,16 @@ import org.apache.poi.util.LittleEndian; *

The property's type determines how its * value is interpreted. For example, if the type is * {@link Variant#VT_LPSTR} (byte string), the value consists of a - * {@link DWord} telling how many bytes the string contains. The bytes - * follow immediately, including any null bytes that terminate the + * DWord telling how many bytes the string contains. The bytes follow + * immediately, including any null bytes that terminate the * string. The type {@link Variant#VT_I4} denotes a four-byte integer * value, {@link Variant#VT_FILETIME} some date and time (of a * file).

* - *

FIXME: Reading of other types than those - * mentioned above and the dictionary property is not yet - * implemented.

+ *

FIXME: Reading of other types than {@link + * Variant#VT_I4}, {@link Variant#VT_FILETIME}, {@link + * Variant#VT_LPSTR}, {@link Variant#VT_CF}, {@link Variant#VT_BOOL}, + * and reading the dictionary property is not yet implemented.

* * @author Rainer Klute (klute@rainer-klute.de) * @author Drew Varner (Drew.Varner InAndAround sc.edu) diff --git a/src/java/org/apache/poi/poifs/property/PropertyConstants.java b/src/java/org/apache/poi/poifs/property/PropertyConstants.java index 59b0dac4a..ea2d06a62 100644 --- a/src/java/org/apache/poi/poifs/property/PropertyConstants.java +++ b/src/java/org/apache/poi/poifs/property/PropertyConstants.java @@ -57,10 +57,6 @@ package org.apache.poi.poifs.property; /** * Interface PropertyConstants - * - * - * @author - * @version %I%, %G% */ public interface PropertyConstants diff --git a/src/testcases/org/apache/poi/hpsf/basic/POIFile.java b/src/testcases/org/apache/poi/hpsf/basic/POIFile.java new file mode 100644 index 000000000..576ca0471 --- /dev/null +++ b/src/testcases/org/apache/poi/hpsf/basic/POIFile.java @@ -0,0 +1,104 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.poi.hpsf.basic; +import org.apache.poi.poifs.filesystem.*; + + + +/** + *

A POI file just for testing.

+ * + * @author Rainer Klute (klute@rainer-klute.de) + * @since 2002-07-20 + * @version $Id$ + */ +public class POIFile +{ + + private String name; + private POIFSDocumentPath path; + private byte[] bytes; + + public void setName(final String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + + public void setPath(final POIFSDocumentPath path) + { + this.path = path; + } + + public POIFSDocumentPath getPath() + { + return path; + } + + public void setBytes(final byte[] bytes) + { + this.bytes = bytes; + } + + public byte[] getBytes() + { + return bytes; + } + +} diff --git a/src/testcases/org/apache/poi/hpsf/basic/TestBasic.java b/src/testcases/org/apache/poi/hpsf/basic/TestBasic.java new file mode 100644 index 000000000..071540986 --- /dev/null +++ b/src/testcases/org/apache/poi/hpsf/basic/TestBasic.java @@ -0,0 +1,224 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.poi.hpsf.basic; + +import java.io.*; +import java.util.*; +import junit.framework.*; +import org.apache.poi.hpsf.*; + + + +/** + *

Tests the basic HPSF functionality.

+ * + * @author Rainer Klute (klute@rainer-klute.de) + * @since 2002-07-20 + * @version $Id$ + */ +public class TestBasic extends TestCase +{ + + final static String POI_FS = "TestGermanWord90.doc"; + final static String[] POI_FILES = new String[] + { + "\005SummaryInformation", + "\005DocumentSummaryInformation", + "WordDocument", + "\001CompObj", + "1Table" + }; + final static int BYTE_ORDER = 0xfffe; + final static int FORMAT = 0x0000; + final static int OS_VERSION = 0x00020A04; + final static byte[] CLASS_ID = + { + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 + }; + final static int[] SECTION_COUNT = + {1, 2}; + final static boolean[] IS_SUMMARY_INFORMATION = + {true, false}; + final static boolean[] IS_DOCUMENT_SUMMARY_INFORMATION = + {false, true}; + + POIFile[] poiFiles; + + + + public TestBasic(String name) + { + super(name); + } + + + + /** + *

Read a the test file from the "data" directory.

+ */ + public void setUp() throws FileNotFoundException, IOException + { + final File dataDir = + new File(System.getProperty("HPSF.testdata.path")); + final File data = new File(dataDir, POI_FS); + + poiFiles = Util.readPOIFiles(data); + } + + + + /** + *

Checks the names of the files in the POI filesystem. They + * are expected to be in a certain order.

+ */ + public void testReadFiles() throws IOException + { + String[] expected = POI_FILES; + for (int i = 0; i < expected.length; i++) + Assert.assertEquals(poiFiles[i].getName(), expected[i]); + } + + + + /** + *

Tests whether property sets can be created from the POI + * files in the POI file system. This test case expects the first + * file to be a {@link SummaryInformation}, the second file to be + * a {@link DocumentSummaryInformation} and the rest to be no + * property sets. In the latter cases a {@link + * NoPropertySetStreamException} will be thrown when trying to + * create a {@link PropertySet}.

+ */ + public void testCreatePropertySets() throws IOException + { + Class[] expected = new Class[] + { + SummaryInformation.class, + DocumentSummaryInformation.class, + NoPropertySetStreamException.class, + NoPropertySetStreamException.class, + NoPropertySetStreamException.class + }; + for (int i = 0; i < expected.length; i++) + { + InputStream in = new ByteArrayInputStream(poiFiles[i].getBytes()); + Object o; + try + { + o = PropertySetFactory.create(in); + } + catch (NoPropertySetStreamException ex) + { + o = ex; + } + catch (UnexpectedPropertySetTypeException ex) + { + o = ex; + } + catch (MarkUnsupportedException ex) + { + o = ex; + } + in.close(); + Assert.assertEquals(o.getClass(), expected[i]); + } + } + + + + /** + *

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}.

+ */ + public void testPropertySetMethods() throws IOException, HPSFException + { + String[] expected = POI_FILES; + + /* Loop over the two property sets. */ + for (int i = 0; i < 2; i++) + { + byte[] b = poiFiles[i].getBytes(); + PropertySet ps = + PropertySetFactory.create(new ByteArrayInputStream(b)); + Assert.assertEquals(ps.getByteOrder(), BYTE_ORDER); + Assert.assertEquals(ps.getFormat(), FORMAT); + Assert.assertEquals(ps.getOSVersion(), OS_VERSION); + Assert.assertEquals(new String(ps.getClassID().getBytes()), + new String(CLASS_ID)); + Assert.assertEquals(ps.getSectionCount(), SECTION_COUNT[i]); + Assert.assertEquals(ps.isSummaryInformation(), + IS_SUMMARY_INFORMATION[i]); + Assert.assertEquals(ps.isDocumentSummaryInformation(), + IS_DOCUMENT_SUMMARY_INFORMATION[i]); + } + } + + + + /** + *

Runs the test cases stand-alone.

+ */ + public static void main(String[] args) + { + System.setProperty("HPSF.testdata.path", + "./src/testcases/org/apache/poi/hpsf/data"); + junit.textui.TestRunner.run(TestBasic.class); + } + +} diff --git a/src/testcases/org/apache/poi/hpsf/basic/Util.java b/src/testcases/org/apache/poi/hpsf/basic/Util.java new file mode 100644 index 000000000..b8ae824ae --- /dev/null +++ b/src/testcases/org/apache/poi/hpsf/basic/Util.java @@ -0,0 +1,173 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.poi.hpsf.basic; + +import java.io.*; +import java.util.*; +import org.apache.poi.poifs.eventfilesystem.*; + + + +/** + *

Static utility methods needed by the HPSF test cases.

+ * + * @author Rainer Klute (klute@rainer-klute.de) + * @since 2002-07-20 + * @version $Id$ + */ +public class Util +{ + + /** + *

Reads bytes from an input stream and writes them to an + * output stream until end of file is encountered.

+ */ + public static void copy(final InputStream in, final OutputStream out) + throws IOException + { + final int BUF_SIZE = 1000; + byte[] b = new byte[BUF_SIZE]; + int read; + boolean eof = false; + while (!eof) + { + try + { + read = in.read(b, 0, BUF_SIZE); + if (read > 0) + out.write(b, 0, read); + else + eof = true; + } + catch (EOFException ex) + { + eof = true; + } + } + } + + + + /** + *

Reads all files from a POI filesystem and returns them as an + * array of {@link POIFile} instances. This method loads all files + * into memory and thus does not cope well with large POI + * filessystems.

+ * + * @param file The name of the POI filesystem as seen by the + * operating system. (This is the "filename".) + * + * @return The POI files. The elements are ordered in the same way + * as the files in the POI filesystem. + */ + public static POIFile[] readPOIFiles(final File poiFs) + throws FileNotFoundException, IOException + { + final List files = new ArrayList(); + POIFSReader r = new POIFSReader(); + r.registerListener(new POIFSReaderListener() + { + public void processPOIFSReaderEvent(POIFSReaderEvent event) + { + try + { + POIFile f = new POIFile(); + f.setName(event.getName()); + f.setPath(event.getPath()); + InputStream in = event.getStream(); + ByteArrayOutputStream out = + new ByteArrayOutputStream(); + Util.copy(in, out); + out.close(); + f.setBytes(out.toByteArray()); + files.add(f); + } + catch (IOException ex) + { + ex.printStackTrace(); + throw new RuntimeException(ex.getMessage()); + } + } + }); + r.read(new FileInputStream(poiFs)); + POIFile[] result = new POIFile[files.size()]; + for (int i = 0; i < result.length; i++) + result[i] = (POIFile) files.get(i); + return result; + } + + + + /** + *

Prints the system properties to System.out.

+ */ + public static void printSystemProperties() + { + Properties p = System.getProperties(); + List names = new LinkedList(); + for (Iterator i = p.keySet().iterator(); i.hasNext();) + names.add(i.next()); + Collections.sort(names); + for (Iterator i = names.iterator(); i.hasNext();) + { + String name = (String) i.next(); + String value = (String) p.get(name); + System.out.println(name + ": " + value); + } + System.out.println("Current directory: " + + System.getProperty("user.dir")); + } + +}