]> source.dussan.org Git - poi.git/commitdiff
First HPSF test cases added.
authorRainer Klute <klute@apache.org>
Mon, 22 Jul 2002 08:25:19 +0000 (08:25 +0000)
committerRainer Klute <klute@apache.org>
Mon, 22 Jul 2002 08:25:19 +0000 (08:25 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352805 13f79535-47bb-0310-9956-ffa450edef68

build.xml
src/java/org/apache/poi/hpsf/Property.java
src/java/org/apache/poi/poifs/property/PropertyConstants.java
src/testcases/org/apache/poi/hpsf/basic/POIFile.java [new file with mode: 0644]
src/testcases/org/apache/poi/hpsf/basic/TestBasic.java [new file with mode: 0644]
src/testcases/org/apache/poi/hpsf/basic/Util.java [new file with mode: 0644]

index 343075e60dda36818d6e8fb62868eff8eba779ee..335afe370c98fd5e29bccf65dcfed0af9e743396 100644 (file)
--- a/build.xml
+++ b/build.xml
                           value="${xlayout.source.test.dir}/org/apache/poi/util/data"/>
          <sysproperty key="HSSF.testdata.path"
                    value="${xlayout.source.test.dir}/org/apache/poi/hssf/data"/>
+         <sysproperty key="HPSF.testdata.path"
+                   value="${xlayout.source.test.dir}/org/apache/poi/hpsf/data"/>
         <classpath>
                <path>
                         <fileset dir="." casesensitive="yes"> 
index 073ac791df331eaf649173c947559a154da5ac42..13c6917c6e695aa9b8708543d1602afd2f6b14dd 100644 (file)
@@ -75,15 +75,16 @@ import org.apache.poi.util.LittleEndian;
  * <p>The property's <strong>type</strong> determines how its
  * <strong>value </strong> 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).</p>
  *
- * <p><strong>FIXME:</strong> Reading of other types than those
- * mentioned above and the dictionary property is not yet
- * implemented.</p>
+ * <p><strong>FIXME:</strong> 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.</p>
  *
  * @author Rainer Klute (klute@rainer-klute.de)
  * @author Drew Varner (Drew.Varner InAndAround sc.edu)
index 59b0dac4aafbf89512ad4c36196cfe2701da5005..ea2d06a62bd4a75e6bd4bdb982852222bfceafb4 100644 (file)
@@ -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 (file)
index 0000000..576ca04
--- /dev/null
@@ -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
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.poi.hpsf.basic;
+import org.apache.poi.poifs.filesystem.*;
+
+
+
+/**
+ * <p>A POI file just for testing.</p>
+ *
+ * @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 (file)
index 0000000..0715409
--- /dev/null
@@ -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
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.poi.hpsf.basic;
+
+import java.io.*;
+import java.util.*;
+import junit.framework.*;
+import org.apache.poi.hpsf.*;
+
+
+
+/**
+ * <p>Tests the basic HPSF functionality.</p>
+ *
+ * @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);
+    }
+
+
+
+    /**
+     * <p>Read a the test file from the "data" directory.</p>
+     */
+    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);
+    }
+
+
+
+    /**
+     * <p>Checks the names of the files in the POI filesystem. They
+     * are expected to be in a certain order.</p>
+     */
+    public void testReadFiles() throws IOException
+    {
+       String[] expected = POI_FILES;
+       for (int i = 0; i < expected.length; i++)
+           Assert.assertEquals(poiFiles[i].getName(), expected[i]);
+    }
+
+
+
+    /**
+     * <p>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}.</p>
+     */
+    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]);
+       }
+    }
+
+
+
+    /**
+     * <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 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]);
+       }
+    }
+
+
+
+    /**
+     * <p>Runs the test cases stand-alone.</p>
+     */
+    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 (file)
index 0000000..b8ae824
--- /dev/null
@@ -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
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.poi.hpsf.basic;
+
+import java.io.*;
+import java.util.*;
+import org.apache.poi.poifs.eventfilesystem.*;
+
+
+
+/**
+ * <p>Static utility methods needed by the HPSF test cases.</p>
+ *
+ * @author Rainer Klute (klute@rainer-klute.de)
+ * @since 2002-07-20
+ * @version $Id$
+ */
+public class Util
+{
+
+    /**
+     * <p>Reads bytes from an input stream and writes them to an
+     * output stream until end of file is encountered.</p>
+     */
+    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;
+            }
+        }
+    }
+
+
+
+    /**
+     * <p>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.</p>
+     * 
+     * @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;
+    }
+
+
+
+    /**
+     * <p>Prints the system properties to System.out.</p>
+     */
+    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"));
+    }
+
+}