From 7e303c76c2c95d178221ebe358a86a7548b85a06 Mon Sep 17 00:00:00 2001
From: Rainer Klute Represents a class ID (16 bytes). Unlike other little-endian
* type the {@link ClassID} is not just 16 bytes stored in the wrong
@@ -98,15 +95,21 @@ public class ClassID
*/
public ClassID()
{
- bytes = new byte[LENGTH];
- for (int i = 0; i < LENGTH; i++)
- bytes[i] = 0x00;
+ bytes = new byte[LENGTH];
+ for (int i = 0; i < LENGTH; i++)
+ bytes[i] = 0x00;
}
- public final static int LENGTH = 16;
+ /** The number of bytes occupied by this object in the byte
+ * stream. Gets the bytes making out the class ID. They are returned in
* correct order, i.e. big-endian. Convenience class representing a DocumentSummary Information stream in a
@@ -90,12 +88,12 @@ public class DocumentSummaryInformation extends SpecialPropertySet
* does not contain a document summary information stream.
*/
public DocumentSummaryInformation(final PropertySet ps)
- throws UnexpectedPropertySetTypeException
+ throws UnexpectedPropertySetTypeException
{
super(ps);
if (!isDocumentSummaryInformation())
throw new UnexpectedPropertySetTypeException
- ("Not a " + getClass().getName());
+ ("Not a " + getClass().getName());
}
diff --git a/src/java/org/apache/poi/hpsf/HPSFException.java b/src/java/org/apache/poi/hpsf/HPSFException.java
index 7358f0365..8a9b7c86d 100644
--- a/src/java/org/apache/poi/hpsf/HPSFException.java
+++ b/src/java/org/apache/poi/hpsf/HPSFException.java
@@ -66,12 +66,16 @@ package org.apache.poi.hpsf;
public class HPSFException extends Exception
{
+ /**
+ * The underlying reason for this exception - may be
+ * Creates a new {@link HPSFException}. Creates an {@link HPSFException}. Creates a new {@link HPSFException} with a message
- * string. Creates an {@link HPSFException} with a message string. Creates a new {@link HPSFException} with a message string
- * and a reason. Creates an {@link HPSFException} with a message string and a
+ * reason. The underlying reason for this exception - may be
+ * Constructor Constructor Constructor Constructor Constructor Constructor Constructor Constructor Constructor Constructor Constructor Constructor Constructor Constructor Constructor Constructor Codepage 1200 denotes Unicode. The property's ID. The property's type. The property's value. Returns the property's size in bytes. This is always a multiple of
+ * 4. The "byteOrder" field must equal this value. Specifies this {@link PropertySet}'s byte order. See the
@@ -124,8 +125,8 @@ public class PropertySet
/**
* The "format" field must equal this value. Specifies this {@link PropertySet}'s format. See the HPFS
@@ -154,21 +155,31 @@ public class PropertySet
protected int osVersion;
- public final static int OS_WIN16 = 0x0000;
- public final static int OS_MACINTOSH = 0x0001;
- public final static int OS_WIN32 = 0x0002;
+ /**
+ * If the OS version field holds this value the property set stream was
+ * created on a 16-bit Windows system. If the OS version field holds this value the property set stream was
+ * created on a Macintosh system. If the OS version field holds this value the property set stream was
+ * created on a 32-bit Windows system. Returns the property set stream's low-level "OS version"
* field. FIXME: Return an Returns the number of {@link Section}s in the property
* set. FIXME: Return an null
.null
.int
instead
- * of a long
in the next major version, i.e. when
- * incompatible changes are allowed.int
instead
- * of a long
in the next major version, i.e. when
- * incompatible changes are allowed.
false
.
* @throws MarkUnsupportedException if the {@link InputStream}
* does not support the {@link InputStream#mark} method.
+ * @exception IOException if an I/O error occurs
*/
public static boolean isPropertySetStream(final InputStream stream)
- throws MarkUnsupportedException, IOException
+ throws MarkUnsupportedException, IOException
{
/*
* Read at most this many bytes.
@@ -353,17 +363,17 @@ public class PropertySet
*/
if (!stream.markSupported())
throw new MarkUnsupportedException(stream.getClass().getName());
- stream.mark(BUFFER_SIZE);
+ stream.mark(BUFFER_SIZE);
/*
* Read a couple of bytes from the stream.
*/
final byte[] buffer = new byte[BUFFER_SIZE];
final int bytes =
- stream.read(buffer, 0,
- Math.min(buffer.length, stream.available()));
+ stream.read(buffer, 0,
+ Math.min(buffer.length, stream.available()));
final boolean isPropertySetStream =
- isPropertySetStream(buffer, 0, bytes);
+ isPropertySetStream(buffer, 0, bytes);
stream.reset();
return isPropertySetStream;
}
@@ -381,34 +391,38 @@ public class PropertySet
* @return true
if the byte array is a property set
* stream, false
if not.
*/
- public static boolean isPropertySetStream(final byte[] src, int offset,
- final int length)
+ public static boolean isPropertySetStream(final byte[] src,
+ final int offset,
+ final int length)
{
+ /* FIXME: Ensure that at most "length" bytes are read. */
+
/*
* Read the header fields of the stream. They must always be
* there.
*/
- final int byteOrder = LittleEndian.getUShort(src, offset);
- offset += LittleEndian.SHORT_SIZE;
+ int o = offset;
+ final int byteOrder = LittleEndian.getUShort(src, o);
+ o += LittleEndian.SHORT_SIZE;
byte[] temp = new byte[LittleEndian.SHORT_SIZE];
- LittleEndian.putShort(temp,(short)byteOrder);
+ LittleEndian.putShort(temp, (short) byteOrder);
if (!Util.equal(temp, BYTE_ORDER_ASSERTION))
return false;
- final int format = LittleEndian.getUShort(src, offset);
- offset += LittleEndian.SHORT_SIZE;
+ final int format = LittleEndian.getUShort(src, o);
+ o += LittleEndian.SHORT_SIZE;
temp = new byte[LittleEndian.SHORT_SIZE];
- LittleEndian.putShort(temp,(short)format);
+ LittleEndian.putShort(temp, (short) format);
if (!Util.equal(temp, FORMAT_ASSERTION))
return false;
- final long osVersion = LittleEndian.getUInt(src, offset);
- offset += LittleEndian.INT_SIZE;
- final ClassID classID = new ClassID(src, offset);
- offset += ClassID.LENGTH;
- final long sectionCount = LittleEndian.getUInt(src, offset);
- offset += LittleEndian.INT_SIZE;
+ // final long osVersion = LittleEndian.getUInt(src, offset);
+ o += LittleEndian.INT_SIZE;
+ // final ClassID classID = new ClassID(src, offset);
+ o += ClassID.LENGTH;
+ final long sectionCount = LittleEndian.getUInt(src, o);
+ o += LittleEndian.INT_SIZE;
if (sectionCount < 1)
return false;
- return true;
+ return true;
}
@@ -424,24 +438,27 @@ public class PropertySet
* from the beginning of src
* @param length Length of the property set stream.
*/
- private void init(final byte[] src, int offset, final int length)
+ private void init(final byte[] src, final int offset, final int length)
{
+ /* FIXME: Ensure that at most "length" bytes are read. */
+
/*
* Read the stream's header fields.
*/
- byteOrder = LittleEndian.getUShort(src, offset);
- offset += LittleEndian.SHORT_SIZE;
- format = LittleEndian.getUShort(src, offset);
- offset += LittleEndian.SHORT_SIZE;
- osVersion = (int) LittleEndian.getUInt(src, offset);
- offset += LittleEndian.INT_SIZE;
- classID = new ClassID(src, offset);
- offset += ClassID.LENGTH;
- sectionCount = LittleEndian.getInt(src, offset);
- offset += LittleEndian.INT_SIZE;
- if (sectionCount <= 0)
- throw new HPSFRuntimeException("Section count " + sectionCount +
- " must be greater than 0.");
+ int o = offset;
+ byteOrder = LittleEndian.getUShort(src, o);
+ o += LittleEndian.SHORT_SIZE;
+ format = LittleEndian.getUShort(src, o);
+ o += LittleEndian.SHORT_SIZE;
+ osVersion = (int) LittleEndian.getUInt(src, o);
+ o += LittleEndian.INT_SIZE;
+ classID = new ClassID(src, o);
+ o += ClassID.LENGTH;
+ sectionCount = LittleEndian.getInt(src, o);
+ o += LittleEndian.INT_SIZE;
+ if (sectionCount <= 0)
+ throw new HPSFRuntimeException("Section count " + sectionCount +
+ " must be greater than 0.");
/*
* Read the sections, which are following the header. They
@@ -463,9 +480,9 @@ public class PropertySet
* "offset" accordingly.
*/
for (int i = 0; i < sectionCount; i++)
- {
- final Section s = new Section(src, offset);
- offset += ClassID.LENGTH + LittleEndian.INT_SIZE;
+ {
+ final Section s = new Section(src, o);
+ o += ClassID.LENGTH + LittleEndian.INT_SIZE;
sections.add(s);
}
}
@@ -482,7 +499,7 @@ public class PropertySet
public boolean isSummaryInformation()
{
return Util.equal(((Section) sections.get(0)).getFormatID().getBytes(),
- SectionIDMap.SUMMARY_INFORMATION_ID);
+ SectionIDMap.SUMMARY_INFORMATION_ID);
}
@@ -497,7 +514,7 @@ public class PropertySet
public boolean isDocumentSummaryInformation()
{
return Util.equal(((Section) sections.get(0)).getFormatID().getBytes(),
- SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID);
+ SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID);
}
@@ -517,7 +534,7 @@ public class PropertySet
* more or less than one {@link Section}.
*/
public Property[] getProperties()
- throws NoSingleSectionException
+ throws NoSingleSectionException
{
return getSingleSection().getProperties();
}
@@ -556,7 +573,7 @@ public class PropertySet
* more or less than one {@link Section}.
*/
protected boolean getPropertyBooleanValue(final int id)
- throws NoSingleSectionException
+ throws NoSingleSectionException
{
return getSingleSection().getPropertyBooleanValue(id);
}
@@ -576,7 +593,7 @@ public class PropertySet
* more or less than one {@link Section}.
*/
protected int getPropertyIntValue(final int id)
- throws NoSingleSectionException
+ throws NoSingleSectionException
{
return getSingleSection().getPropertyIntValue(id);
}
@@ -609,16 +626,14 @@ public class PropertySet
* If the {@link PropertySet} has only a single section this * method returns it.
* - *@return The singleSection value - *@throws NoSingleSectionException if the {@link PropertySet} has - *more or less than exactly one {@link Section}. + * @return The singleSection value */ public Section getSingleSection() { if (sectionCount != 1) - throw new NoSingleSectionException - ("Property set contains " + sectionCount + " sections."); - return ((Section) sections.get(0)); + throw new NoSingleSectionException + ("Property set contains " + sectionCount + " sections."); + return ((Section) sections.get(0)); } } diff --git a/src/java/org/apache/poi/hpsf/PropertySetFactory.java b/src/java/org/apache/poi/hpsf/PropertySetFactory.java index ebd094a15..bb03da05c 100644 --- a/src/java/org/apache/poi/hpsf/PropertySetFactory.java +++ b/src/java/org/apache/poi/hpsf/PropertySetFactory.java @@ -54,7 +54,8 @@ */ package org.apache.poi.hpsf; -import java.io.*; +import java.io.InputStream; +import java.io.IOException; /** *Factory class to create instances of {@link SummaryInformation}, @@ -86,8 +87,8 @@ public class PropertySetFactory * @throws IOException if some I/O problem occurs. */ public static PropertySet create(final InputStream stream) - throws NoPropertySetStreamException, MarkUnsupportedException, - UnexpectedPropertySetTypeException, IOException + throws NoPropertySetStreamException, MarkUnsupportedException, + UnexpectedPropertySetTypeException, IOException { final PropertySet ps = new PropertySet(stream); if (ps.isSummaryInformation()) diff --git a/src/java/org/apache/poi/hpsf/Section.java b/src/java/org/apache/poi/hpsf/Section.java index ac75accda..bd8bcf0d6 100644 --- a/src/java/org/apache/poi/hpsf/Section.java +++ b/src/java/org/apache/poi/hpsf/Section.java @@ -54,9 +54,10 @@ */ package org.apache.poi.hpsf; -import java.util.*; +import java.util.Map; import org.apache.poi.util.LittleEndian; -import org.apache.poi.hpsf.wellknown.*; +import org.apache.poi.hpsf.wellknown.PropertyIDMap; +import org.apache.poi.hpsf.wellknown.SectionIDMap; /** *
Represents a section in a {@link PropertySet}.
@@ -75,6 +76,9 @@ public class Section */ protected Map dictionary; + /** + *The section's format ID, {@link #getFormatID}.
+ */ protected ClassID formatID; @@ -95,6 +99,9 @@ public class Section + /** + * @see #getOffset + */ protected long offset; @@ -110,6 +117,9 @@ public class Section + /** + * @see #getSize + */ protected int size; @@ -125,6 +135,9 @@ public class Section + /** + * @see #getPropertyCount + */ protected int propertyCount; @@ -140,6 +153,9 @@ public class Section + /** + * @see #getProperties + */ protected Property[] properties; @@ -159,7 +175,7 @@ public class Section *Creates an empty and uninitialized {@link Section}. */ protected Section() - {} + { } @@ -170,32 +186,34 @@ public class Section * @param offset The position in the stream that points to the * section's format ID. */ - public Section(final byte[] src, int offset) + public Section(final byte[] src, final int offset) { + int o1 = offset; + /* * Read the format ID. */ - formatID = new ClassID(src, offset); - offset += ClassID.LENGTH; + formatID = new ClassID(src, o1); + o1 += ClassID.LENGTH; /* * Read the offset from the stream's start and positions to * the section header. */ - this.offset = LittleEndian.getUInt(src, offset); - offset = (int)this.offset; + this.offset = LittleEndian.getUInt(src, o1); + o1 = (int) this.offset; /* * Read the section length. */ - size = (int)LittleEndian.getUInt(src, offset); - offset += LittleEndian.INT_SIZE; + size = (int) LittleEndian.getUInt(src, o1); + o1 += LittleEndian.INT_SIZE; /* * Read the number of properties. */ - propertyCount = (int)LittleEndian.getUInt(src, offset); - offset += LittleEndian.INT_SIZE; + propertyCount = (int) LittleEndian.getUInt(src, o1); + o1 += LittleEndian.INT_SIZE; /* * Read the properties. The offset is positioned at the first @@ -207,20 +225,19 @@ public class Section * other words: Before we can read any strings we have to know * whether they are in Unicode or not. Unfortunately property * 1 is not guaranteed to be the first in a section. - * - * The algorithm below reads the properties in two passes: The - * first one looks for property ID 1 and extracts the codepage - * number. The seconds pass reads the other properties. + * + * The algorithm below reads the properties in two passes: The + * first one looks for property ID 1 and extracts the codepage + * number. The seconds pass reads the other properties. */ properties = new Property[propertyCount]; - Property propertyOne; - /* Pass 1: Look for the codepage. */ - int codepage = -1; - int pass1Offset = offset; + /* Pass 1: Look for the codepage. */ + int codepage = -1; + int pass1Offset = o1; for (int i = 0; i < properties.length; i++) - { - /* Read the property ID. */ + { + /* Read the property ID. */ final int id = (int) LittleEndian.getUInt(src, pass1Offset); pass1Offset += LittleEndian.INT_SIZE; @@ -229,44 +246,44 @@ public class Section pass1Offset += LittleEndian.INT_SIZE; /* Calculate the length of the property. */ - int length; - if (i == properties.length - 1) - length = (int) (src.length - this.offset - sOffset); - else - length = (int) - LittleEndian.getUInt(src, pass1Offset + - LittleEndian.INT_SIZE) - sOffset; +// int length; +// if (i == properties.length - 1) +// length = (int) (src.length - this.offset - sOffset); +// else +// length = (int) +// LittleEndian.getUInt(src, pass1Offset + +// LittleEndian.INT_SIZE) - sOffset; - if (id == PropertyIDMap.PID_CODEPAGE) - { - /* Read the codepage if the property ID is 1. */ + if (id == PropertyIDMap.PID_CODEPAGE) + { + /* Read the codepage if the property ID is 1. */ - /* Read the property's value type. It must be - * VT_I2. */ - int o = (int) (this.offset + sOffset); - final long type = LittleEndian.getUInt(src, o); - o += LittleEndian.INT_SIZE; + /* Read the property's value type. It must be + * VT_I2. */ + int o = (int) (this.offset + sOffset); + final long type = LittleEndian.getUInt(src, o); + o += LittleEndian.INT_SIZE; - if (type != Variant.VT_I2) - throw new HPSFRuntimeException - ("Value type of property ID 1 is not VT_I2 but " + - type + "."); + if (type != Variant.VT_I2) + throw new HPSFRuntimeException + ("Value type of property ID 1 is not VT_I2 but " + + type + "."); /* Read the codepage number. */ codepage = LittleEndian.getUShort(src, o); - } - } + } + } - /* Pass 2: Read all properties, including 1. */ + /* Pass 2: Read all properties, including 1. */ for (int i = 0; i < properties.length; i++) - { - /* Read the property ID. */ - final int id = (int) LittleEndian.getUInt(src, offset); - offset += LittleEndian.INT_SIZE; + { + /* Read the property ID. */ + final int id = (int) LittleEndian.getUInt(src, o1); + o1 += LittleEndian.INT_SIZE; /* Offset from the section. */ - final int sOffset = (int) LittleEndian.getUInt(src, offset); - offset += LittleEndian.INT_SIZE; + final int sOffset = (int) LittleEndian.getUInt(src, o1); + o1 += LittleEndian.INT_SIZE; /* Calculate the length of the property. */ int length; @@ -274,12 +291,12 @@ public class Section length = (int) (src.length - this.offset - sOffset); else length = (int) - LittleEndian.getUInt(src, offset + LittleEndian.INT_SIZE) - + LittleEndian.getUInt(src, o1 + LittleEndian.INT_SIZE) - sOffset; /* Create it. */ properties[i] = new Property(id, src, this.offset + sOffset, - length, codepage); + length, codepage); } /* @@ -325,9 +342,7 @@ public class Section */ protected int getPropertyIntValue(final int id) { - /* FIXME: Find out why the following is a Long instead of an - * Integer! */ - final Long i = (Long) getProperty(id); + final Integer i = (Integer) getProperty(id); if (i != null) return i.intValue(); else @@ -358,6 +373,11 @@ public class Section + /** + *
This member is true
if the last call to {@link
+ * #getPropertyIntValue} or {@link #getProperty} tried to access a
+ * property that was not available, else false
.
Abstract superclass for the convenience classes {@link @@ -90,17 +89,30 @@ import org.apache.poi.util.LittleEndian; public abstract class SpecialPropertySet extends PropertySet { + /** + *
The "real" property set SpecialPropertySet
+ * delegates to.
Creates a SpecialPropertySet
.
+ *
+ * @param ps The property set encapsulated by the
+ * SpecialPropertySet
+ */
+ public SpecialPropertySet(final PropertySet ps)
{
delegate = ps;
}
+ /**
+ * @see PropertySet#getByteOrder
+ */
public int getByteOrder()
{
return delegate.getByteOrder();
@@ -108,6 +120,9 @@ public abstract class SpecialPropertySet extends PropertySet
+ /**
+ * @see PropertySet#getFormat
+ */
public int getFormat()
{
return delegate.getFormat();
@@ -115,20 +130,19 @@ public abstract class SpecialPropertySet extends PropertySet
- /*
- * This is intentionally no javadoc comment.
- *
- * FIXME: Return an int
instead of a
- * long
in the next major version, i.e. when
- * incompatible changes are allowed.
+ /**
+ * @see PropertySet#getOSVersion
*/
- public long getOSVersion()
+ public int getOSVersion()
{
return delegate.getOSVersion();
}
+ /**
+ * @see PropertySet#getClassID
+ */
public ClassID getClassID()
{
return delegate.getClassID();
@@ -136,20 +150,19 @@ public abstract class SpecialPropertySet extends PropertySet
- /*
- * This is intentionally no javadoc comment.
- *
- * FIXME: Return an int
instead of a
- * long
in the next major version, i.e. when
- * incompatible changes are allowed.
+ /**
+ * @see PropertySet#getSectionCount
*/
- public long getSectionCount()
+ public int getSectionCount()
{
return delegate.getSectionCount();
}
+ /**
+ * @see PropertySet#getSections
+ */
public List getSections()
{
return delegate.getSections();
@@ -157,6 +170,9 @@ public abstract class SpecialPropertySet extends PropertySet
+ /**
+ * @see PropertySet#isSummaryInformation
+ */
public boolean isSummaryInformation()
{
return delegate.isSummaryInformation();
@@ -164,6 +180,9 @@ public abstract class SpecialPropertySet extends PropertySet
+ /**
+ * @see PropertySet#isDocumentSummaryInformation
+ */
public boolean isDocumentSummaryInformation()
{
return delegate.isDocumentSummaryInformation();
@@ -171,6 +190,9 @@ public abstract class SpecialPropertySet extends PropertySet
+ /**
+ * @see PropertySet#getSingleSection
+ */
public Section getSingleSection()
{
return delegate.getSingleSection();
diff --git a/src/java/org/apache/poi/hpsf/SummaryInformation.java b/src/java/org/apache/poi/hpsf/SummaryInformation.java
index c9a5e8ebb..be54e79b0 100644
--- a/src/java/org/apache/poi/hpsf/SummaryInformation.java
+++ b/src/java/org/apache/poi/hpsf/SummaryInformation.java
@@ -58,9 +58,8 @@
*/
package org.apache.poi.hpsf;
-import java.io.*;
-import java.util.*;
-import org.apache.poi.hpsf.wellknown.*;
+import java.util.Date;
+import org.apache.poi.hpsf.wellknown.PropertyIDMap;
/**
*
Convenience class representing a Summary Information stream in a @@ -96,12 +95,12 @@ public class SummaryInformation extends SpecialPropertySet * does not contain a summary information stream. */ public SummaryInformation(final PropertySet ps) - throws UnexpectedPropertySetTypeException + throws UnexpectedPropertySetTypeException { super(ps); if (!isSummaryInformation()) throw new UnexpectedPropertySetTypeException - ("Not a " + getClass().getName()); + ("Not a " + getClass().getName()); } diff --git a/src/java/org/apache/poi/hpsf/Thumbnail.java b/src/java/org/apache/poi/hpsf/Thumbnail.java index 037113850..e17bcab8e 100644 --- a/src/java/org/apache/poi/hpsf/Thumbnail.java +++ b/src/java/org/apache/poi/hpsf/Thumbnail.java @@ -208,7 +208,7 @@ public class Thumbnail * * @param thumbnailData The thumbnail data */ - public Thumbnail(byte[] thumbnailData) + public Thumbnail(final byte[] thumbnailData) { this.thumbnailData = thumbnailData; } @@ -236,7 +236,7 @@ public class Thumbnail * @param thumbnail The new thumbnail value * @see SummaryInformation#getThumbnail() */ - public void setThumbnail(byte[] thumbnail) + public void setThumbnail(final byte[] thumbnail) { this.thumbnailData = thumbnail; } @@ -260,7 +260,7 @@ public class Thumbnail public long getClipboardFormatTag() { long clipboardFormatTag = LittleEndian.getUInt(getThumbnail(), - OFFSET_CFTAG); + OFFSET_CFTAG); return clipboardFormatTag; } @@ -289,7 +289,7 @@ public class Thumbnail { if (!(getClipboardFormatTag() == CFTAG_WINDOWS)) throw new HPSFException("Clipboard Format Tag of Thumbnail must " + - "be CFTAG_WINDOWS."); + "be CFTAG_WINDOWS."); return LittleEndian.getUInt(getThumbnail(), OFFSET_CF); } @@ -316,20 +316,20 @@ public class Thumbnail { if (!(getClipboardFormatTag() == CFTAG_WINDOWS)) throw new HPSFException("Clipboard Format Tag of Thumbnail must " + - "be CFTAG_WINDOWS."); + "be CFTAG_WINDOWS."); if (!(getClipboardFormat() == CF_METAFILEPICT)) throw new HPSFException("Clipboard Format of Thumbnail must " + - "be CF_METAFILEPICT."); + "be CF_METAFILEPICT."); else - { + { byte[] thumbnail = getThumbnail(); int wmfImageLength = thumbnail.length - OFFSET_WMFDATA; byte[] wmfImage = new byte[wmfImageLength]; System.arraycopy(thumbnail, - OFFSET_WMFDATA, - wmfImage, - 0, - wmfImageLength); + OFFSET_WMFDATA, + wmfImage, + 0, + wmfImageLength); return wmfImage; } } diff --git a/src/java/org/apache/poi/hpsf/UnexpectedPropertySetTypeException.java b/src/java/org/apache/poi/hpsf/UnexpectedPropertySetTypeException.java index 83779fe7a..0f541f989 100644 --- a/src/java/org/apache/poi/hpsf/UnexpectedPropertySetTypeException.java +++ b/src/java/org/apache/poi/hpsf/UnexpectedPropertySetTypeException.java @@ -69,26 +69,50 @@ package org.apache.poi.hpsf; public class UnexpectedPropertySetTypeException extends HPSFException { + /** + *
Creates an {@link UnexpectedPropertySetTypeException}.
+ */ public UnexpectedPropertySetTypeException() { super(); } + /** + *Creates an {@link UnexpectedPropertySetTypeException} with a message + * string.
+ * + * @param msg The message string. + */ public UnexpectedPropertySetTypeException(final String msg) { super(msg); } + /** + *Creates a new {@link UnexpectedPropertySetTypeException} with a + * reason.
+ * + * @param reason The reason, i.e. a throwable that indirectly + * caused this exception. + */ public UnexpectedPropertySetTypeException(final Throwable reason) { super(reason); } + /** + *Creates an {@link UnexpectedPropertySetTypeException} with a message + * string and a reason.
+ * + * @param msg The message string. + * @param reason The reason, i.e. a throwable that indirectly + * caused this exception. + */ public UnexpectedPropertySetTypeException(final String msg, - final Throwable reason) + final Throwable reason) { super(msg, reason); } diff --git a/src/java/org/apache/poi/hpsf/Util.java b/src/java/org/apache/poi/hpsf/Util.java index 9d138114d..00182e225 100644 --- a/src/java/org/apache/poi/hpsf/Util.java +++ b/src/java/org/apache/poi/hpsf/Util.java @@ -54,7 +54,7 @@ */ package org.apache.poi.hpsf; -import java.util.*; +import java.util.Date; /** *Provides various static utility methods.
@@ -90,10 +90,10 @@ public class Util { if (a.length != b.length) return false; - for (int i = 0; i < a.length; i++) + for (int i = 0; i < a.length; i++) if (a[i] != b[i]) return false; - return true; + return true; } @@ -108,8 +108,8 @@ public class Util * @param dstOffset Offset in the destination byte array. */ public static void copy(final byte[] src, final int srcOffset, - final int length, final byte[] dst, - final int dstOffset) + final int length, final byte[] dst, + final int dstOffset) { for (int i = 0; i < length; i++) dst[dstOffset + i] = src[srcOffset + i]; @@ -130,7 +130,7 @@ public class Util int capacity = 0; for (int i = 0; i < byteArrays.length; i++) capacity += byteArrays[i].length; - final byte[] result = new byte[capacity]; + final byte[] result = new byte[capacity]; int r = 0; for (int i = 0; i < byteArrays.length; i++) for (int j = 0; j < byteArrays[i].length; j++) @@ -150,7 +150,7 @@ public class Util * @return The new byte array. Its length is number of copied bytes. */ public static byte[] copy(final byte[] src, final int offset, - final int length) + final int length) { final byte[] result = new byte[length]; copy(src, offset, length, result, 0); @@ -167,7 +167,7 @@ public class Util * did you notice that you can tell from the epochs which * operating system is the modern one? :-)) */ - public final static long EPOCH_DIFF = 11644473600000L; + public static final long EPOCH_DIFF = 11644473600000L; /** diff --git a/src/java/org/apache/poi/hpsf/wellknown/PropertyIDMap.java b/src/java/org/apache/poi/hpsf/wellknown/PropertyIDMap.java index 9d64c1613..f5a907449 100644 --- a/src/java/org/apache/poi/hpsf/wellknown/PropertyIDMap.java +++ b/src/java/org/apache/poi/hpsf/wellknown/PropertyIDMap.java @@ -54,7 +54,7 @@ */ package org.apache.poi.hpsf.wellknown; -import java.util.*; +import java.util.HashMap; /** *This is a dictionary which maps property ID values to property @@ -66,10 +66,10 @@ import java.util.*; * should treat them as unmodifiable, copy them and modifiy the * copies.
* - *FIXME: Make the singletons - * unmodifiable. However, since this requires to use a {@link HashMap} - * delegate instead of extending {@link HashMap} and thus requires a - * lot of stupid typing. I won't do that for the time being.
+ *FIXME: Make the singletons unmodifiable. However, + * since this requires to use a {@link HashMap} delegate instead of + * extending {@link HashMap} and thus requires a lot of stupid typing. I won't + * do that for the time being.
* * @author Rainer Klute (klute@rainer-klute.de) * @version $Id$ @@ -82,24 +82,67 @@ public class PropertyIDMap extends HashMap * The following definitions are for property IDs in the first * (and only) section of the Summary Information property set. */ - public final static int PID_TITLE = 2; - public final static int PID_SUBJECT = 3; - public final static int PID_AUTHOR = 4; - public final static int PID_KEYWORDS = 5; - public final static int PID_COMMENTS = 6; - public final static int PID_TEMPLATE = 7; - public final static int PID_LASTAUTHOR = 8; - public final static int PID_REVNUMBER = 9; - public final static int PID_EDITTIME = 10; - public final static int PID_LASTPRINTED = 11; - public final static int PID_CREATE_DTM = 12; - public final static int PID_LASTSAVE_DTM = 13; - public final static int PID_PAGECOUNT = 14; - public final static int PID_WORDCOUNT = 15; - public final static int PID_CHARCOUNT = 16; - public final static int PID_THUMBNAIL = 17; - public final static int PID_APPNAME = 18; - public final static int PID_SECURITY = 19; + + /**ID of the property that denotes the document's title
*/ + public static final int PID_TITLE = 2; + + /**ID of the property that denotes the document's subject
*/ + public static final int PID_SUBJECT = 3; + + /**ID of the property that denotes the document's author
*/ + public static final int PID_AUTHOR = 4; + + /**ID of the property that denotes the document's keywords
*/ + public static final int PID_KEYWORDS = 5; + + /**ID of the property that denotes the document's comments
*/ + public static final int PID_COMMENTS = 6; + + /**ID of the property that denotes the document's template
*/ + public static final int PID_TEMPLATE = 7; + + /**ID of the property that denotes the document's last author
*/ + public static final int PID_LASTAUTHOR = 8; + + /**ID of the property that denotes the document's revision number
*/ + public static final int PID_REVNUMBER = 9; + + /**ID of the property that denotes the document's edit time
*/ + public static final int PID_EDITTIME = 10; + + /**ID of the property that denotes the date and time the document was + * last printed
*/ + public static final int PID_LASTPRINTED = 11; + + /**ID of the property that denotes the date and time the document was + * created.
*/ + public static final int PID_CREATE_DTM = 12; + + /**ID of the property that denotes the date and time the document was + * saved
*/ + public static final int PID_LASTSAVE_DTM = 13; + + /**ID of the property that denotes the number of pages in the + * document
*/ + public static final int PID_PAGECOUNT = 14; + + /**ID of the property that denotes the number of words in the + * document
*/ + public static final int PID_WORDCOUNT = 15; + + /**ID of the property that denotes the number of characters in the + * document
*/ + public static final int PID_CHARCOUNT = 16; + + /**ID of the property that denotes the document's thumbnail
*/ + public static final int PID_THUMBNAIL = 17; + + /**ID of the property that denotes the application that created the + * document
*/ + public static final int PID_APPNAME = 18; + + /**ID of the property that denotes... FIXME
*/ + public static final int PID_SECURITY = 19; @@ -111,66 +154,66 @@ public class PropertyIDMap extends HashMap /** *The entry is a dictionary.
*/ - public final static int PID_DICTIONARY = 0; + public static final int PID_DICTIONARY = 0; /** *The entry denotes a code page.
*/ - public final static int PID_CODEPAGE = 1; + public static final int PID_CODEPAGE = 1; /** *The entry is a string denoting the category the file belongs * to, e.g. review, memo, etc. This is useful to find documents of * same type.
*/ - public final static int PID_CATEGORY = 2; + public static final int PID_CATEGORY = 2; /** *Target format for power point presentation, e.g. 35mm, * printer, video etc.
*/ - public final static int PID_PRESFORMAT = 3; + public static final int PID_PRESFORMAT = 3; /** *Number of bytes.
*/ - public final static int PID_BYTECOUNT = 4; + public static final int PID_BYTECOUNT = 4; /** *Number of lines.
*/ - public final static int PID_LINECOUNT = 5; + public static final int PID_LINECOUNT = 5; /** *Number of paragraphs.
*/ - public final static int PID_PARCOUNT = 6; + public static final int PID_PARCOUNT = 6; /** *Number of slides in a power point presentation.
*/ - public final static int PID_SLIDECOUNT = 7; + public static final int PID_SLIDECOUNT = 7; /** *Number of slides with notes.
*/ - public final static int PID_NOTECOUNT = 8; + public static final int PID_NOTECOUNT = 8; /** *Number of hidden slides.
*/ - public final static int PID_HIDDENCOUNT = 9; + public static final int PID_HIDDENCOUNT = 9; /** *Number of multimedia clips, e.g. sound or video.
*/ - public final static int PID_MMCLIPCOUNT = 10; + public static final int PID_MMCLIPCOUNT = 10; /** *This entry is set to -1 when scaling of the thumbnail is * desired. Otherwise the thumbnail should be cropped.
*/ - public final static int PID_SCALE = 11; + public static final int PID_SCALE = 11; /** *This entry denotes an internally used property. It is a @@ -179,30 +222,30 @@ public class PropertyIDMap extends HashMap * number tells how many document parts are under that * heading.
*/ - public final static int PID_HEADINGPAIR = 12; + public static final int PID_HEADINGPAIR = 12; /** *This entry contains the names of document parts (word: names * of the documents in the master document, excel: sheet names, * power point: slide titles, binder: document names).
*/ - public final static int PID_DOCPARTS = 13; + public static final int PID_DOCPARTS = 13; /** *This entry contains the name of the project manager.
*/ - public final static int PID_MANAGER = 14; + public static final int PID_MANAGER = 14; /** *This entry contains the company name.
*/ - public final static int PID_COMPANY = 15; + public static final int PID_COMPANY = 15; /** *If this entry is -1 the links are dirty and should be * re-evaluated.
*/ - public final static int PID_LINKSDIRTY = 16; + public static final int PID_LINKSDIRTY = 16; @@ -224,8 +267,12 @@ public class PropertyIDMap extends HashMap /** *Creates a {@link PropertyIDMap}.
+ * + * @param initialCapacity The initial capacity as defined for + * {@link HashMap} + * @param loadFactor The load factor as defined for {@link HashMap} */ - public PropertyIDMap(int initialCapacity, float loadFactor) + public PropertyIDMap(final int initialCapacity, final float loadFactor) { super(initialCapacity, loadFactor); } @@ -238,12 +285,12 @@ public class PropertyIDMap extends HashMap * * @param id The ID. * @param idString The ID string. - * @return As specified by the {@link Map} interface, this method + * @return As specified by the {@link java.util.Map} interface, this method * returns the previous value associated with the specified * id, ornull
if there was no mapping for
* key.
*/
- public Object put(int id, String idString)
+ public Object put(final int id, final String idString)
{
return put(new Integer(id), idString);
}
@@ -257,7 +304,7 @@ public class PropertyIDMap extends HashMap
* @param id The ID.
* @return The ID string associated with id.
*/
- public Object get(int id)
+ public Object get(final int id)
{
return get(new Integer(id));
}
@@ -265,12 +312,12 @@ public class PropertyIDMap extends HashMap
/**
- * Returns the Summary Information properties singleton.
+ * @return the Summary Information properties singleton */ public static PropertyIDMap getSummaryInformationProperties() { if (summaryInformationProperties == null) - { + { PropertyIDMap m = new PropertyIDMap(18, (float) 1.0); m.put(PID_TITLE, "PID_TITLE"); m.put(PID_SUBJECT, "PID_SUBJECT"); @@ -306,7 +353,7 @@ public class PropertyIDMap extends HashMap public static PropertyIDMap getDocumentSummaryInformationProperties() { if (documentSummaryInformationProperties == null) - { + { PropertyIDMap m = new PropertyIDMap(17, (float) 1.0); m.put(PID_DICTIONARY, "PID_DICTIONARY"); m.put(PID_CODEPAGE, "PID_CODEPAGE"); @@ -334,8 +381,10 @@ public class PropertyIDMap extends HashMap /** *For the most basic testing.
+ * + * @param args The command-line arguments */ - public static void main(String args[]) + public static void main(final String[] args) { PropertyIDMap s1 = getSummaryInformationProperties(); PropertyIDMap s2 = getDocumentSummaryInformationProperties(); diff --git a/src/java/org/apache/poi/hpsf/wellknown/SectionIDMap.java b/src/java/org/apache/poi/hpsf/wellknown/SectionIDMap.java index 4a7bfbc6b..7dfe60fd0 100644 --- a/src/java/org/apache/poi/hpsf/wellknown/SectionIDMap.java +++ b/src/java/org/apache/poi/hpsf/wellknown/SectionIDMap.java @@ -54,7 +54,7 @@ */ package org.apache.poi.hpsf.wellknown; -import java.util.*; +import java.util.HashMap; /** *Maps section format IDs to {@link PropertyIDMap}s. It is
@@ -67,7 +67,7 @@ import java.util.*;
* is well-known and you can query the {@link PropertyIDMap} for PID
* strings. If you get back null
you are on your own.
This {@link Map} expects the byte arrays of section format IDs + *
This {@link java.util.Map} expects the byte arrays of section format IDs * as keys. A key maps to a {@link PropertyIDMap} describing the * property IDs in sections with the specified section format ID.
* @@ -81,12 +81,12 @@ public class SectionIDMap extends HashMap /** *The SummaryInformation's section's format ID.
*/ - public final static byte[] SUMMARY_INFORMATION_ID = new byte[] + public static final byte[] SUMMARY_INFORMATION_ID = new byte[] { - (byte) 0xF2, (byte) 0x9F, (byte) 0x85, (byte) 0xE0, - (byte) 0x4F, (byte) 0xF9, (byte) 0x10, (byte) 0x68, - (byte) 0xAB, (byte) 0x91, (byte) 0x08, (byte) 0x00, - (byte) 0x2B, (byte) 0x27, (byte) 0xB3, (byte) 0xD9 + (byte) 0xF2, (byte) 0x9F, (byte) 0x85, (byte) 0xE0, + (byte) 0x4F, (byte) 0xF9, (byte) 0x10, (byte) 0x68, + (byte) 0xAB, (byte) 0x91, (byte) 0x08, (byte) 0x00, + (byte) 0x2B, (byte) 0x27, (byte) 0xB3, (byte) 0xD9 }; /** @@ -94,16 +94,23 @@ public class SectionIDMap extends HashMap * ID. The second section has a different format ID which is not * well-known. */ - public final static byte[] DOCUMENT_SUMMARY_INFORMATION_ID = new byte[] + public static final byte[] DOCUMENT_SUMMARY_INFORMATION_ID = new byte[] { - (byte) 0xD5, (byte) 0xCD, (byte) 0xD5, (byte) 0x02, - (byte) 0x2E, (byte) 0x9C, (byte) 0x10, (byte) 0x1B, - (byte) 0x93, (byte) 0x97, (byte) 0x08, (byte) 0x00, - (byte) 0x2B, (byte) 0x2C, (byte) 0xF9, (byte) 0xAE + (byte) 0xD5, (byte) 0xCD, (byte) 0xD5, (byte) 0x02, + (byte) 0x2E, (byte) 0x9C, (byte) 0x10, (byte) 0x1B, + (byte) 0x93, (byte) 0x97, (byte) 0x08, (byte) 0x00, + (byte) 0x2B, (byte) 0x2C, (byte) 0xF9, (byte) 0xAE }; - public final static String UNDEFINED = "[undefined]"; + /** + *A property without a known name is described by this string.
+ */ + public static final String UNDEFINED = "[undefined]"; + /** + *The default section ID map. It maps section format IDs to + * {@link PropertyIDMap}s.
+ */ private static SectionIDMap defaultMap; @@ -117,12 +124,12 @@ public class SectionIDMap extends HashMap public static SectionIDMap getInstance() { if (defaultMap == null) - { + { final SectionIDMap m = new SectionIDMap(); m.put(SUMMARY_INFORMATION_ID, - PropertyIDMap.getSummaryInformationProperties()); + PropertyIDMap.getSummaryInformationProperties()); m.put(DOCUMENT_SUMMARY_INFORMATION_ID, - PropertyIDMap.getDocumentSummaryInformationProperties()); + PropertyIDMap.getDocumentSummaryInformationProperties()); defaultMap = m; } return defaultMap; @@ -144,14 +151,14 @@ public class SectionIDMap extends HashMap * string "[undefined]" is returned. */ public static String getPIDString(final byte[] sectionFormatID, - final int pid) + final int pid) { final PropertyIDMap m = - (PropertyIDMap) getInstance().get(sectionFormatID); + (PropertyIDMap) getInstance().get(sectionFormatID); if (m == null) return UNDEFINED; else - { + { final String s = (String) m.get(pid); if (s == null) return UNDEFINED; @@ -164,6 +171,9 @@ public class SectionIDMap extends HashMap /** *Returns the {@link PropertyIDMap} for a given section format * ID.
+ * + * @param sectionFormatID the section format ID + * @return the property ID map */ public PropertyIDMap get(final byte[] sectionFormatID) { @@ -178,6 +188,7 @@ public class SectionIDMap extends HashMap * * @param sectionFormatID A section format ID as a byte[] . * @deprecated Use {@link #get(byte[])} instead! + * @return the property ID map */ public Object get(final Object sectionFormatID) { @@ -189,9 +200,13 @@ public class SectionIDMap extends HashMap /** *Associates a section format ID with a {@link * PropertyIDMap}.
+ * + * @param sectionFormatID the section format ID + * @param propertyIDMap the property ID map + * @return as defined by {@link java.util.Map#put} */ public Object put(final byte[] sectionFormatID, - final PropertyIDMap propertyIDMap) + final PropertyIDMap propertyIDMap) { return super.put(new String(sectionFormatID), propertyIDMap); } @@ -200,6 +215,14 @@ public class SectionIDMap extends HashMap /** * @deprecated Use {@link #put(byte[], PropertyIDMap)} instead! + * @link #put(byte[], PropertyIDMap) + * + * @param key This parameter remains undocumented since the method is + * deprecated. + * @param value This parameter remains undocumented since the method is + * deprecated. + * @return The return value remains undocumented since the method is + * deprecated. */ public Object put(final Object key, final Object value) {