From bb343314a6f71af21daa211f428fc4b59be90f3d Mon Sep 17 00:00:00 2001 From: Rainer Klute Date: Sat, 20 Sep 2003 15:43:08 +0000 Subject: [PATCH] - Comparing sections refined: For the dictionary (property 0) only the value (Map) is relevant. The dictionary's codepage (property 1) is disregarded. - New sample application CopyCompare. I'll turn that into a testcase later. git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353362 13f79535-47bb-0310-9956-ffa450edef68 --- .../content/xdocs/hpsf/how-to.xml | 28 +- .../apache/poi/hpsf/examples/CopyCompare.java | 566 ++++++++++++++++++ .../hpsf/examples/ReadCustomPropertySets.java | 8 +- .../apache/poi/hpsf/examples/ReadTitle.java | 3 +- .../hpsf/examples/WriteAuthorAndTitle.java | 3 +- .../apache/poi/hpsf/examples/WriteTitle.java | 3 +- src/java/org/apache/poi/hpsf/Section.java | 72 ++- src/java/org/apache/poi/hpsf/Util.java | 6 +- .../org/apache/poi/hpsf/data/Test0313rur.adm | Bin 0 -> 99840 bytes .../org/apache/poi/hpsf/data/TestEditTime.doc | Bin 0 -> 19456 bytes .../org/apache/poi/hpsf/data/TestMickey.doc | Bin 0 -> 12288 bytes 11 files changed, 666 insertions(+), 23 deletions(-) create mode 100644 src/examples/src/org/apache/poi/hpsf/examples/CopyCompare.java create mode 100644 src/testcases/org/apache/poi/hpsf/data/Test0313rur.adm create mode 100644 src/testcases/org/apache/poi/hpsf/data/TestEditTime.doc create mode 100644 src/testcases/org/apache/poi/hpsf/data/TestMickey.doc diff --git a/src/documentation/content/xdocs/hpsf/how-to.xml b/src/documentation/content/xdocs/hpsf/how-to.xml index cc1b3ce725..d632a4c97e 100644 --- a/src/documentation/content/xdocs/hpsf/how-to.xml +++ b/src/documentation/content/xdocs/hpsf/how-to.xml @@ -700,16 +700,16 @@ No property set stream: "/1Table" 0 The property's value is a dictionary, i.e. a - mapping from property IDs to strings. + mapping from property IDs to strings. 1 The property's value is the number of a codepage, - i.e. a mapping from character codes to characters. All strings in the - section containing this property must be interpreted using this - codepage. Typical property values are 1252 (8-bit "western" characters) - or 1200 (16-bit Unicode characters). + i.e. a mapping from character codes to characters. All strings in the + section containing this property must be interpreted using this + codepage. Typical property values are 1252 (8-bit "western" characters) + or 1200 (16-bit Unicode characters). @@ -1036,15 +1036,15 @@ final String fileName = args[0];

The MutableSection the sample application retrieved from the MutablePropertySet is still empty. It contains no properties and does not have a format ID. As you have read above the format ID of the first section in a property set - determines the property set's type. Since our property set should become - a SummaryInformation property set we have to set the format ID of its - first (and only) section to - F29F85E0-4FF9-1068-AB-91-08-00-2B-27-B3-D9. However, you - won't have to remember that ID: HPSF has it defined as the well-known - constant SectionIDMap.SUMMARY_INFORMATION_ID. The sample - application writes it to the section using the - setFormatID(byte[]) method:

+ href="#sec3">above the format ID of the first section in a + property set determines the property set's type. Since our property set + should become a SummaryInformation property set we have to set the format + ID of its first (and only) section to + F29F85E0-4FF9-1068-AB-91-08-00-2B-27-B3-D9. However, you + won't have to remember that ID: HPSF has it defined as the well-known + constant SectionIDMap.SUMMARY_INFORMATION_ID. The sample + application writes it to the section using the + setFormatID(byte[]) method:

ms.setFormatID(SectionIDMap.SUMMARY_INFORMATION_ID); diff --git a/src/examples/src/org/apache/poi/hpsf/examples/CopyCompare.java b/src/examples/src/org/apache/poi/hpsf/examples/CopyCompare.java new file mode 100644 index 0000000000..94b3a426ca --- /dev/null +++ b/src/examples/src/org/apache/poi/hpsf/examples/CopyCompare.java @@ -0,0 +1,566 @@ +/* + * ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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" 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", + * 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.examples; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.poi.hpsf.HPSFRuntimeException; +import org.apache.poi.hpsf.MarkUnsupportedException; +import org.apache.poi.hpsf.MutablePropertySet; +import org.apache.poi.hpsf.NoPropertySetStreamException; +import org.apache.poi.hpsf.PropertySet; +import org.apache.poi.hpsf.PropertySetFactory; +import org.apache.poi.hpsf.Util; +import org.apache.poi.hpsf.WritingNotSupportedException; +import org.apache.poi.poifs.eventfilesystem.POIFSReader; +import org.apache.poi.poifs.eventfilesystem.POIFSReaderEvent; +import org.apache.poi.poifs.eventfilesystem.POIFSReaderListener; +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.Entry; +import org.apache.poi.poifs.filesystem.POIFSDocumentPath; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; + +/** + *

This class copies a POI file system to a new file and compares the copy + * with the original.

+ * + *

Property set streams are copied logically, i.e. the application + * establishes a {@link org.apache.poi.hpsf.PropertySet} of an original property + * set, creates a {@link org.apache.poi.hpsf.MutablePropertySet} from the + * {@link org.apache.poi.hpsf.PropertySet} and writes the + * {@link org.apache.poi.hpsf.MutablePropertySet} to the destination POI file + * system. - Streams which are no property set streams are copied bit by + * bit.

+ * + *

The comparison of the POI file systems is done logically. That means that + * the two disk files containing the POI file systems do not need to be + * exactly identical. However, both POI file systems must contain the same + * files, and most of these files must be bitwise identical. Property set + * streams, however, are compared logically: they must have the same sections + * with the same attributs, and the sections must contain the same properties. + * Details like the ordering of the properties do not matter.

+ * + * @author Rainer Klute <klute@rainer-klute.de> + * @version $Id$ + * @since 2003-09-19 + */ +public class CopyCompare +{ + /** + *

Runs the example program. The application expects one or two + * arguments:

+ * + *
    + * + *
  1. The first argument is the disk file name of the POI filesystem to + * copy.

  2. + * + *
  3. The second argument is optional. If it is given, it is the name of + * a disk file the copy of the POI filesystem will be written to. If it is + * not given, the copy will be written to a temporary file which will be + * deleted at the end of the program.

  4. + * + *
+ * + * @param args Command-line arguments. + * @exception MarkUnsupportedException if a POI document stream does not + * support the mark() operation. + * @exception NoPropertySetStreamException if the application tries to + * create a property set from a POI document stream that is not a property + * set stream. + * @exception IOException if any I/O exception occurs. + */ + public static void main(final String[] args) + throws MarkUnsupportedException, NoPropertySetStreamException, IOException + { + String originalFileName = null; + String copyFileName = null; + + /* Check the command-line arguments. */ + if (args.length == 1) + { + originalFileName = args[0]; + File f = File.createTempFile("CopyOfPOIFileSystem-", ".ole2"); + f.deleteOnExit(); + copyFileName = f.getAbsolutePath(); + } + else if (args.length == 2) + { + originalFileName = args[0]; + copyFileName = args[1]; + } + else + { + System.err.println("Usage: " + CopyCompare.class.getName() + + "originPOIFS [copyPOIFS]"); + System.exit(1); + } + + /* Read the origin POIFS using the eventing API. The real work is done + * in the class CopyFile which is registered here as a POIFSReader. */ + final POIFSReader r = new POIFSReader(); + final CopyFile cf = new CopyFile(copyFileName); + r.registerListener(cf); + r.read(new FileInputStream(originalFileName)); + + /* Write the new POIFS to disk. */ + cf.close(); + + /* Read all documents from the original POI file system and compare them + * with the equivalent document from the copy. */ + final POIFSFileSystem opfs = + new POIFSFileSystem(new FileInputStream(originalFileName)); + final POIFSFileSystem cpfs = + new POIFSFileSystem(new FileInputStream(copyFileName)); + + final DirectoryEntry oRoot = opfs.getRoot(); + final DirectoryEntry cRoot = cpfs.getRoot(); + final StringBuffer messages = new StringBuffer(); + if (equal(oRoot, cRoot, messages)) + System.out.println("Equal"); + else + System.out.println("Not equal: " + messages.toString()); + } + + + + /** + *

Compares two {@link DirectoryEntry} instances of a POI file system. + * The directories must contain the same streams with the same names and + * contents.

+ * + * @param d1 The first directory. + * @param d2 The second directory. + * @param msg The method may append human-readable comparison messages to + * this string buffer. + * @return true if the directories are equal, else + * false. + * @exception MarkUnsupportedException if a POI document stream does not + * support the mark() operation. + * @exception NoPropertySetStreamException if the application tries to + * create a property set from a POI document stream that is not a property + * set stream. + * @exception IOException if any I/O exception occurs. + */ + private static boolean equal(final DirectoryEntry d1, + final DirectoryEntry d2, + final StringBuffer msg) + throws MarkUnsupportedException, NoPropertySetStreamException, IOException + { + boolean equal = true; + /* Iterate over d1 and compare each entry with its counterpart in d2. */ + for (final Iterator i = d1.getEntries(); equal && i.hasNext();) + { + final Entry e1 = (Entry) i.next(); + final String n1 = e1.getName(); + Entry e2 = null; + try + { + e2 = d2.getEntry(n1); + } + catch (FileNotFoundException ex) + { + msg.append("Document \"" + e1 + "\" exitsts, document \"" + + e2 + "\" does not.\n"); + equal = false; + break; + } + + if (e1.isDirectoryEntry() && e2.isDirectoryEntry()) + equal = equal((DirectoryEntry) e1, (DirectoryEntry) e2, msg); + else if (e1.isDocumentEntry() && e2.isDocumentEntry()) + equal = equal((DocumentEntry) e1, (DocumentEntry) e2, msg); + else + { + msg.append("One of \"" + e1 + "\" and \"" + e2 + "\" is a " + + "document while the other one is a directory.\n"); + equal = false; + } + } + + /* Iterate over d2 just to make sure that there are no entries in d2 + * that are not in d1. */ + for (final Iterator i = d2.getEntries(); equal && i.hasNext();) + { + final Entry e2 = (Entry) i.next(); + final String n2 = e2.getName(); + Entry e1 = null; + try + { + e1 = d1.getEntry(n2); + } + catch (FileNotFoundException ex) + { + msg.append("Document \"" + e2 + "\" exitsts, document \"" + + e1 + "\" does not.\n"); + equal = false; + break; + } + } + return equal; + } + + + + /** + *

Compares two {@link DocumentEntry} instances of a POI file system. + * Documents that are not property set streams must be bitwise identical. + * Property set streams must be logically equal.

+ * + * @param d1 The first document. + * @param d2 The second document. + * @param msg The method may append human-readable comparison messages to + * this string buffer. + * @return true if the documents are equal, else + * false. + * @exception MarkUnsupportedException if a POI document stream does not + * support the mark() operation. + * @exception NoPropertySetStreamException if the application tries to + * create a property set from a POI document stream that is not a property + * set stream. + * @exception IOException if any I/O exception occurs. + */ + private static boolean equal(final DocumentEntry d1, final DocumentEntry d2, + final StringBuffer msg) + throws MarkUnsupportedException, NoPropertySetStreamException, IOException + { + boolean equal = true; + final DocumentInputStream dis1 = new DocumentInputStream(d1); + final DocumentInputStream dis2 = new DocumentInputStream(d2); + if (PropertySet.isPropertySetStream(dis1) && + PropertySet.isPropertySetStream(dis2)) + { + final PropertySet ps1 = PropertySetFactory.create(dis1); + final PropertySet ps2 = PropertySetFactory.create(dis2); + equal = ps1.equals(ps2); + if (!equal) + { + msg.append("Property sets are not equal.\n"); + return equal; + } + } + else + { + int i1; + int i2; + do + { + i1 = dis1.read(); + i2 = dis2.read(); + if (i1 != i2) + { + equal = false; + msg.append("Documents are not equal.\n"); + break; + } + } + while (equal && i1 == -1); + } + return true; + } + + + + /** + *

This class does all the work. Its method {@link + * #processPOIFSReaderEvent(POIFSReaderEvent)} is called for each file in + * the original POI file system. Except for property set streams it copies + * everything unmodified to the destination POI filesystem. Property set + * streams are copied by creating a new {@link PropertySet} from the + * original property set by using the {@link + * MutablePropertySet#MutablePropertySet(PropertySet) constructor.

+ */ + static class CopyFile implements POIFSReaderListener + { + String dstName; + OutputStream out; + POIFSFileSystem poiFs; + + + /** + *

The constructor of a {@link CopyFile} instance creates the target + * POIFS. It also stores the name of the file the POIFS will be written + * to once it is complete.

+ * + * @param dstName The name of the disk file the destination POIFS is to + * be written to. + * @throws FileNotFoundException + */ + public CopyFile(final String dstName) + { + this.dstName = dstName; + poiFs = new POIFSFileSystem(); + } + + + /** + *

The method is called by POI's eventing API for each file in the + * origin POIFS.

+ */ + public void processPOIFSReaderEvent(final POIFSReaderEvent event) + { + /* The following declarations are shortcuts for accessing the + * "event" object. */ + final POIFSDocumentPath path = event.getPath(); + final String name = event.getName(); + final DocumentInputStream stream = event.getStream(); + + Throwable t = null; + + try + { + /* Find out whether the current document is a property set + * stream or not. */ + if (PropertySet.isPropertySetStream(stream)) + { + /* Yes, the current document is a property set stream. + * Let's create a PropertySet instance from it. */ + PropertySet ps = null; + try + { + ps = PropertySetFactory.create(stream); + } + catch (NoPropertySetStreamException ex) + { + /* This exception will not be thrown because we already + * checked above. */ + } + + /* Copy the property set to the destination POI file + * system. */ + copy(poiFs, path, name, ps); + } + else + /* No, the current document is not a property set stream. We + * copy it unmodified to the destination POIFS. */ + copy(poiFs, event.getPath(), event.getName(), stream); + } + catch (MarkUnsupportedException ex) + { + t = ex; + } + catch (IOException ex) + { + t = ex; + } + catch (WritingNotSupportedException ex) + { + t = ex; + } + + /* According to the definition of the processPOIFSReaderEvent method + * we cannot pass checked exceptions to the caller. The following + * lines check whether a checked exception occured and throws an + * unchecked exception. The message of that exception is that of + * the underlying checked exception. */ + if (t != null) + { + throw new HPSFRuntimeException + ("Could not read file \"" + path + "/" + name + + "\". Reason: " + Util.toString(t)); + } + } + + + + /** + *

Writes a {@link PropertySet} to a POI filesystem.

+ * + * @param poiFs The POI filesystem to write to. + * @param path The file's path in the POI filesystem. + * @param name The file's name in the POI filesystem. + * @param ps The property set to write. + */ + public void copy(final POIFSFileSystem poiFs, + final POIFSDocumentPath path, + final String name, + final PropertySet ps) + throws WritingNotSupportedException, IOException + { + final DirectoryEntry de = getPath(poiFs, path); + final MutablePropertySet mps = new MutablePropertySet(ps); + de.createDocument(name, mps.toInputStream()); + } + + + + /** + *

Copies the bytes from a {@link DocumentInputStream} to a new + * stream in a POI filesystem.

+ * + * @param poiFs The POI filesystem to write to. + * @param path The source document's path. + * @param stream The stream containing the source document. + */ + public void copy(final POIFSFileSystem poiFs, + final POIFSDocumentPath path, + final String name, + final DocumentInputStream stream) throws IOException + { + final DirectoryEntry de = getPath(poiFs, path); + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + int c; + while ((c = stream.read()) != -1) + out.write(c); + stream.close(); + out.close(); + final InputStream in = + new ByteArrayInputStream(out.toByteArray()); + de.createDocument(name, in); + } + + + /** + *

Writes the POI file system to a disk file.

+ * + * @throws FileNotFoundException + * @throws IOException + */ + public void close() throws FileNotFoundException, IOException + { + out = new FileOutputStream(dstName); + poiFs.writeFilesystem(out); + out.close(); + } + + + + /** Contains the directory paths that have already been created in the + * output POI filesystem and maps them to their corresponding + * {@link org.apache.poi.poifs.filesystem.DirectoryNode}s. */ + private final Map paths = new HashMap(); + + + + /** + *

Ensures that the directory hierarchy for a document in a POI + * fileystem is in place. When a document is to be created somewhere in + * a POI filesystem its directory must be created first. This method + * creates all directories between the POI filesystem root and the + * directory the document should belong to which do not yet exist.

+ * + *

Unfortunately POI does not offer a simple method to interrogate + * the POIFS whether a certain child node (file or directory) exists in + * a directory. However, since we always start with an empty POIFS which + * contains the root directory only and since each directory in the + * POIFS is created by this method we can maintain the POIFS's directory + * hierarchy ourselves: The {@link DirectoryEntry} of each directory + * created is stored in a {@link Map}. The directories' path names map + * to the corresponding {@link DirectoryEntry} instances.

+ * + * @param poiFs The POI filesystem the directory hierarchy is created + * in, if needed. + * @param path The document's path. This method creates those directory + * components of this hierarchy which do not yet exist. + * @return The directory entry of the document path's parent. The caller + * should use this {@link DirectoryEntry} to create documents in it. + */ + public DirectoryEntry getPath(final POIFSFileSystem poiFs, + final POIFSDocumentPath path) + { + try + { + /* Check whether this directory has already been created. */ + final String s = path.toString(); + DirectoryEntry de = (DirectoryEntry) paths.get(s); + if (de != null) + /* Yes: return the corresponding DirectoryEntry. */ + return de; + + /* No: We have to create the directory - or return the root's + * DirectoryEntry. */ + int l = path.length(); + if (l == 0) + /* Get the root directory. It does not have to be created + * since it always exists in a POIFS. */ + de = poiFs.getRoot(); + else + { + /* Create a subordinate directory. The first step is to + * ensure that the parent directory exists: */ + de = getPath(poiFs, path.getParent()); + /* Now create the target directory: */ + de = de.createDirectory(path.getComponent + (path.length() - 1)); + } + paths.put(s, de); + return de; + } + catch (IOException ex) + { + /* This exception will be thrown if the directory already + * exists. However, since we have full control about directory + * creation we can ensure that this will never happen. */ + ex.printStackTrace(System.err); + throw new RuntimeException(ex); + } + } + } + +} diff --git a/src/examples/src/org/apache/poi/hpsf/examples/ReadCustomPropertySets.java b/src/examples/src/org/apache/poi/hpsf/examples/ReadCustomPropertySets.java index 93853f45ad..dc0376e5e6 100644 --- a/src/examples/src/org/apache/poi/hpsf/examples/ReadCustomPropertySets.java +++ b/src/examples/src/org/apache/poi/hpsf/examples/ReadCustomPropertySets.java @@ -70,13 +70,13 @@ import org.apache.poi.poifs.eventfilesystem.POIFSReaderListener; import org.apache.poi.util.HexDump; /** - *

Sample application showing how to read a custom property set of - * a document. Call it with the document's file name as command line - * parameter.

+ *

Sample application showing how to read a document's custom property set. + * Call it with the document's file name as command-line parameter.

* *

Explanations can be found in the HPSF HOW-TO.

* - * @author Rainer Klute (klute@rainer-klute.de) + * @author Rainer Klute <klute@rainer-klute.de> * @version $Id$ * @since 2003-02-01 */ diff --git a/src/examples/src/org/apache/poi/hpsf/examples/ReadTitle.java b/src/examples/src/org/apache/poi/hpsf/examples/ReadTitle.java index fcd61542e1..5d4ef3b947 100644 --- a/src/examples/src/org/apache/poi/hpsf/examples/ReadTitle.java +++ b/src/examples/src/org/apache/poi/hpsf/examples/ReadTitle.java @@ -70,7 +70,8 @@ import org.apache.poi.poifs.eventfilesystem.POIFSReaderListener; * *

Explanations can be found in the HPSF HOW-TO.

* - * @author Rainer Klute (klute@rainer-klute.de) + * @author Rainer Klute <klute@rainer-klute.de> * @version $Id$ * @since 2003-02-01 */ diff --git a/src/examples/src/org/apache/poi/hpsf/examples/WriteAuthorAndTitle.java b/src/examples/src/org/apache/poi/hpsf/examples/WriteAuthorAndTitle.java index d0b203dfdd..dd550dae01 100644 --- a/src/examples/src/org/apache/poi/hpsf/examples/WriteAuthorAndTitle.java +++ b/src/examples/src/org/apache/poi/hpsf/examples/WriteAuthorAndTitle.java @@ -118,7 +118,8 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem; * *

Further explanations can be found in the HPSF HOW-TO.

* - * @author Rainer Klute (klute@rainer-klute.de) + * @author Rainer Klute <klute@rainer-klute.de> * @version $Id$ * @since 2003-09-01 */ diff --git a/src/examples/src/org/apache/poi/hpsf/examples/WriteTitle.java b/src/examples/src/org/apache/poi/hpsf/examples/WriteTitle.java index df85917e68..2b1367cb19 100644 --- a/src/examples/src/org/apache/poi/hpsf/examples/WriteTitle.java +++ b/src/examples/src/org/apache/poi/hpsf/examples/WriteTitle.java @@ -72,7 +72,8 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem; *

This class is a simple sample application showing how to create a property * set and write it to disk.

* - * @author Rainer Klute (klute@rainer-klute.de) + * @author Rainer Klute <klute@rainer-klute.de> * @version $Id$ * @since 2003-09-12 */ diff --git a/src/java/org/apache/poi/hpsf/Section.java b/src/java/org/apache/poi/hpsf/Section.java index efe74015c3..dcbea1b60d 100644 --- a/src/java/org/apache/poi/hpsf/Section.java +++ b/src/java/org/apache/poi/hpsf/Section.java @@ -504,7 +504,77 @@ public class Section return false; if (s.getPropertyCount() != getPropertyCount()) return false; - return Util.equals(s.getProperties(), getProperties()); + + /* Compare all properties except 0 and 1 as they must be handled + * specially. */ + Property[] pa1 = new Property[getProperties().length]; + Property[] pa2 = new Property[s.getProperties().length]; + System.arraycopy(getProperties(), 0, pa1, 0, pa1.length); + System.arraycopy(s.getProperties(), 0, pa2, 0, pa2.length); + + /* Extract properties 0 and 1 and remove them from the copy of the + * arrays. */ + Property p10 = null; + Property p11; + Property p20 = null; + Property p21; + for (int i = 0; i < pa1.length; i++) + { + final long id = pa1[i].getID(); + if (id == 0) + { + p10 = pa1[i]; + pa1 = remove(pa1, i); + i--; + } + if (id == 1) + { + p11 = pa1[i]; + pa1 = remove(pa1, i); + i--; + } + } + for (int i = 0; i < pa2.length; i++) + { + final long id = pa2[i].getID(); + if (id == 0) + { + p20 = pa2[i]; + pa2 = remove(pa2, i); + i--; + } + if (id == 1) + { + p21 = pa2[i]; + pa2 = remove(pa2, i); + i--; + } + } + + boolean dictionaryEqual = true; + if (p10 != null && p20 != null) + dictionaryEqual = p10.getValue().equals(p20.getValue()); + else if (p10 != null || p20 != null) + dictionaryEqual = false; + if (!dictionaryEqual) + return false; + else + return Util.equals(pa1, pa2); + } + + + + /** + *

Removes a field from a property array. The resulting array is + * compactified and returned.

+ */ + private Property[] remove(final Property[] pa, final int i) + { + final Property[] h = new Property[pa.length - 1]; + if (i > 0) + System.arraycopy(pa, 0, h, 0, i); + System.arraycopy(pa, i + 1, h, i, h.length - i); + return h; } diff --git a/src/java/org/apache/poi/hpsf/Util.java b/src/java/org/apache/poi/hpsf/Util.java index c3ec949247..dc9454c2c1 100644 --- a/src/java/org/apache/poi/hpsf/Util.java +++ b/src/java/org/apache/poi/hpsf/Util.java @@ -263,13 +263,17 @@ public class Util { for (int i1 = 0; i1 < o1.length; i1++) { + final Object obj1 = o1[i1]; boolean matchFound = false; for (int i2 = 0; !matchFound && i2 < o1.length; i2++) - if (o1[i1].equals(o2[i2])) + { + final Object obj2 = o2[i2]; + if (obj1.equals(obj2)) { matchFound = true; o2[i2] = null; } + } if (!matchFound) return false; } diff --git a/src/testcases/org/apache/poi/hpsf/data/Test0313rur.adm b/src/testcases/org/apache/poi/hpsf/data/Test0313rur.adm new file mode 100644 index 0000000000000000000000000000000000000000..1e1f9547be540d2f46e25f803758f4f234debe52 GIT binary patch literal 99840 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ðC+(hN$+^MdafgEYR1jDo4!mX8T4t-b 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 J>h1;){2SIza6bS5 literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hpsf/data/TestMickey.doc b/src/testcases/org/apache/poi/hpsf/data/TestMickey.doc new file mode 100644 index 0000000000000000000000000000000000000000..f62ade3161c10fbca05f41c3e48226c0f9ee34c8 GIT binary patch literal 12288 zcmeHNU2GIp6h6Cj3k8Y=l^9UGHY8%KtC&DQBPnSiRxPcRKVM9yv$NfSotbrJwsrME zh(9sL7!aa7U@Y+u(HPX25PTs@qAx}w;lacQOdugVAu%x+Z2i9ZDcdcSB0rHZ7rr@j z?>+aNbI<*md(Zap&ohth{&LRmQj?a+BpDiRkov0f6y6)+e3Qsjyt8a*czBq_Qvkds z=?3z^ZyyyzKh{vk@iX`k*&IA4i9DPUd23pb8})cNJt}+Q3?@gBH4!axvLKB|Z$tg& zh;Jg4tZ(2!8uPz{%tGXMu z<<+hD9=C{TY+0O-CC4-_zm%Mqua?%zsm;gyv3&K+-q|M~{XP|sNKE5)7o)M9i_uvA z)un3+rl;^ID9@ zT7Tm`vh7fMcS?30O22m~{o&yUKRWi<$5SSMGG+3f!OW+FnY~wcf?jKB*yo#odB8H@ z3E(N98+ZYD5qJsM3A_&s0v`b10N(=qMyv&72>;H>*>iG^kiV|A-HH7F;DK~GC3S1J zJe!jA+AWe^w`C?iJK_Q!pyL#f0}SAEU=GH0E^r^faUKdaULpApW+zRqi3f0YpE^Ts z!MQypPl7VtDbo7Ka2m9J6+c)-;VGzIw1ztUj(}tIqgj@>o*CXP%`&^)$ZO>yK3$rt z^|@N9pjJAzKbl>5cAONUD}Tt(h##T@yw&qnXI&JLL3XC@An&B1ew&zjgxPd%aA?^J(B`)bW@_ zMK5#b8%bel&@?PN-4q<*rbpi#-}H;dj40!kdpF{vdP|huWK;%lUhv{--LZIHnAI75 zHB?uxtL2=2Q@=pbhy}?@;(^2ii3hHu2e{pFhv!DfEfgDY5cA=7$+*rx!1U;y_j8tw zmu7>9^_SusPexLA{XDQ5pEyT+QL;j8P**A#!HK8Yl1atZ2A|Fb&L)wA!BbX-Bz(q^ z0fv-XInj{TL%SDm}ome{E{gpZP086cuWPhNIN&5eIAcfJLgqS5QlA5*4^L`Ky^G4!f zao|VLL^^vIBSTRz6ZoEu>$6Mb&!t~I2c}D;A*|R;u!2W3a$X*L_5Cwvy9!O8ZJQ$Z z-~08i520*7Dmdp@zZKwI-U)F2?gO|EegwF^90&OO#W{fAv)j;!b9z1~=XEP6=k8OW z?2ix1IldW`^ZZRv&h?$3obQ96ob!7?Ip6nzQvY!%od?P`)prGCgL1YVeQgNKDP!yf zA*`dGn!81|>~zx7~Zf15$MMwdl-wqgIph|RXrl2hycCTZp4z`89b@E2ae`^Pgg{A;iHZbizUSxNa*E9rRY zV(}l|kJ3kfI=U-6w`u#ki2t;l{h}RZnVPZ|=s1aTUU%>+-2mHe0C=-00gS)A4kY)_ VvG-57B}q522a@>1O+5JM`oB}-h1viB literal 0 HcmV?d00001