From d99a03d6d9a7617af4f1a0c7f8b2cca60c5ba843 Mon Sep 17 00:00:00 2001
From: Rainer Klute <klute@apache.org>
Date: Sat, 13 Sep 2003 12:31:28 +0000
Subject: [PATCH] - PropertySetFactory.create(InputStream) no longer throws an
 UnexpectedPropertySetTypeException. - HPSFRuntimeException is thrown when the
 application tries to read a non-integer property with
 Section.getPropertyIntValue(long). - Package description updated. -
 ClassIDhashCode() implemented.

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353349 13f79535-47bb-0310-9956-ffa450edef68
---
 src/java/org/apache/poi/hpsf/ClassID.java     |  2 +-
 .../org/apache/poi/hpsf/MutableSection.java   |  1 -
 .../apache/poi/hpsf/PropertySetFactory.java   | 24 ++++++++----
 src/java/org/apache/poi/hpsf/Section.java     | 13 +++++--
 .../apache/poi/hpsf/SummaryInformation.java   | 17 +++++---
 src/java/org/apache/poi/hpsf/package.html     | 39 ++++++++++++-------
 6 files changed, 65 insertions(+), 31 deletions(-)

diff --git a/src/java/org/apache/poi/hpsf/ClassID.java b/src/java/org/apache/poi/hpsf/ClassID.java
index e179a6352b..ddd52c686e 100644
--- a/src/java/org/apache/poi/hpsf/ClassID.java
+++ b/src/java/org/apache/poi/hpsf/ClassID.java
@@ -236,7 +236,7 @@ public class ClassID
      */
     public int hashCode()
     {
-        throw new UnsupportedOperationException("FIXME: Not yet implemented.");
+        return new String(bytes).hashCode();
     }
 
 }
diff --git a/src/java/org/apache/poi/hpsf/MutableSection.java b/src/java/org/apache/poi/hpsf/MutableSection.java
index 0249269a88..10945426ac 100644
--- a/src/java/org/apache/poi/hpsf/MutableSection.java
+++ b/src/java/org/apache/poi/hpsf/MutableSection.java
@@ -62,7 +62,6 @@ import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.LittleEndianConsts;
 
 /**
  * <p>Adds writing capability to the {@link Section} class.</p>
diff --git a/src/java/org/apache/poi/hpsf/PropertySetFactory.java b/src/java/org/apache/poi/hpsf/PropertySetFactory.java
index 39b4ac88a2..6f6d8e6ed2 100644
--- a/src/java/org/apache/poi/hpsf/PropertySetFactory.java
+++ b/src/java/org/apache/poi/hpsf/PropertySetFactory.java
@@ -56,6 +56,7 @@ package org.apache.poi.hpsf;
 
 import java.io.InputStream;
 import java.io.IOException;
+import java.rmi.UnexpectedException;
 
 /**
  * <p>Factory class to create instances of {@link SummaryInformation},
@@ -89,15 +90,24 @@ public class PropertySetFactory
      */
     public static PropertySet create(final InputStream stream)
         throws NoPropertySetStreamException, MarkUnsupportedException,
-               UnexpectedPropertySetTypeException, IOException
+               IOException
     {
         final PropertySet ps = new PropertySet(stream);
-        if (ps.isSummaryInformation())
-            return new SummaryInformation(ps);
-        else if (ps.isDocumentSummaryInformation())
-            return new DocumentSummaryInformation(ps);
-        else
-            return ps;
+        try
+        {
+            if (ps.isSummaryInformation())
+                return new SummaryInformation(ps);
+            else if (ps.isDocumentSummaryInformation())
+                return new DocumentSummaryInformation(ps);
+            else
+                return ps;
+        }
+        catch (UnexpectedPropertySetTypeException ex)
+        {
+            /* This exception will never be throws because we already checked
+             * explicitly for this case above. */
+            throw new UnexpectedException(ex.toString());
+        }
     }
 
 }
diff --git a/src/java/org/apache/poi/hpsf/Section.java b/src/java/org/apache/poi/hpsf/Section.java
index a85894dcf1..9a27a3dedc 100644
--- a/src/java/org/apache/poi/hpsf/Section.java
+++ b/src/java/org/apache/poi/hpsf/Section.java
@@ -401,11 +401,16 @@ public class Section
      */
     protected int getPropertyIntValue(final long id)
     {
-        final Long i = (Long) getProperty(id);
-        if (i != null)
-            return i.intValue();
-        else
+        final Long i;
+        final Object o = getProperty(id);
+        if (o == null)
             return 0;
+        if (!(o instanceof Long))
+            throw new HPSFRuntimeException
+                ("This property is not an integer type, but " +
+                 o.getClass().getName() + ".");
+        i = (Long) o;
+        return i.intValue();
     }
 
 
diff --git a/src/java/org/apache/poi/hpsf/SummaryInformation.java b/src/java/org/apache/poi/hpsf/SummaryInformation.java
index 5384ae4eee..2b32f3fc34 100644
--- a/src/java/org/apache/poi/hpsf/SummaryInformation.java
+++ b/src/java/org/apache/poi/hpsf/SummaryInformation.java
@@ -204,13 +204,19 @@ public class SummaryInformation extends SpecialPropertySet
 
 
     /**
-     * <p>Returns the stream's edit time (or <code>null</code>).</p>
+     * <p>Returns the total time spent in editing the document
+     * (or <code>0</code>).</p>
      *
-     * @return The edit time or <code>null</code>
+     * @return The total time spent in editing the document or 0 if the {@link
+     * SummaryInformation} does not contain this information.
      */
-    public Date getEditTime()
+    public long getEditTime()
     {
-        return (Date) getProperty(PropertyIDMap.PID_EDITTIME);
+        final Date d = (Date) getProperty(PropertyIDMap.PID_EDITTIME);
+        if (d == null)
+            return 0;
+        else
+            return Util.dateToFileTime(d);
     }
 
 
@@ -258,7 +264,8 @@ public class SummaryInformation extends SpecialPropertySet
      * <p>Returns the stream's page count or 0 if the {@link
      * SummaryInformation} does not contain a page count.</p>
      *
-     * @return The page count or <code>null</code>
+     * @return The page count or 0 if the {@link SummaryInformation} does not
+     * contain a page count.
      */
     public int getPageCount()
     {
diff --git a/src/java/org/apache/poi/hpsf/package.html b/src/java/org/apache/poi/hpsf/package.html
index 31fcb05bf0..346b5c1bc1 100644
--- a/src/java/org/apache/poi/hpsf/package.html
+++ b/src/java/org/apache/poi/hpsf/package.html
@@ -9,7 +9,7 @@
   <div>
    <p>Processes streams in the Horrible Property Set Format (HPSF) in POI
     filesystems. Microsoft Office documents, i.e. POI filesystems, usually
-    contain meta data like author, title, last editing date etc. These items
+    contain meta data like author, title, last saving time etc. These items
     are called <strong>properties</strong> and stored in
     <strong>property set streams</strong> along with the document itself. These
     streams are commonly named <tt>\005SummaryInformation</tt> and
@@ -71,31 +71,44 @@
     the hassle of first finding out what the title's property ID is and then
     using this ID to get the property's value.</p>
 
+   <p>Writing properties can be done with the classes
+    {@link org.apache.poi.hpsf.MutablePropertySet}, {@link
+    org.apache.poi.hpsf.MutableSection}, and {@link
+    org.apache.poi.hpsf.MutableProperty}.</p>
+
+   <div>
+    <h2>History</h2>
+
+    <dl>
+     <dt>2003-09-11:</dt>
+
+     <dd>
+      <p>{@link org.apache.poi.hpsf.PropertySetFactory#create(InputStream)} no
+       longer throws an
+       {@link org.apache.poi.hpsf.UnexpectedPropertySetTypeException}.</p></dd>
+    </dl>
+   </div>
+
+
    <div>
     <h2>To Do</h2>
 
-    <p>The following is still left to be implemented:</p>
+    <p>The following is still left to be implemented. Sponsering could foster
+     these issues considerably.</p>
 
     <ul>
 
      <li>
-      <p>Property dictionaries</p>
+      <p>Convenience methods for setting summary information and document
+       summary information properties</p>
      </li>
 
      <li>
-      <p>Writing property sets</p>
+      <p>Better codepage support</p>
      </li>
 
      <li>
-      <p>Codepage support</p>
-     </li>
-
-     <li>
-      <p>Property type Unicode string</p>
-     </li>
-
-     <li>
-      <p>Further property types</p>
+      <p>Support for more property (variant) types</p>
      </li>
 
     </ul>