From 7e303c76c2c95d178221ebe358a86a7548b85a06 Mon Sep 17 00:00:00 2001 From: Rainer Klute Date: Sat, 2 Aug 2003 19:02:28 +0000 Subject: [PATCH] Javadoc, formatting and style improvements git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353280 13f79535-47bb-0310-9956-ffa450edef68 --- .classpath | 17 +- .project | 8 +- src/java/org/apache/poi/hpsf/ClassID.java | 61 ++++--- .../poi/hpsf/DocumentSummaryInformation.java | 8 +- .../org/apache/poi/hpsf/HPSFException.java | 13 +- .../apache/poi/hpsf/HPSFRuntimeException.java | 2 + .../hpsf/IllegalPropertySetDataException.java | 21 ++- .../poi/hpsf/MarkUnsupportedException.java | 21 ++- .../hpsf/NoPropertySetStreamException.java | 21 ++- .../poi/hpsf/NoSingleSectionException.java | 19 ++ src/java/org/apache/poi/hpsf/Property.java | 101 ++++++----- src/java/org/apache/poi/hpsf/PropertySet.java | 167 ++++++++++-------- .../apache/poi/hpsf/PropertySetFactory.java | 7 +- src/java/org/apache/poi/hpsf/Section.java | 130 ++++++++------ .../apache/poi/hpsf/SpecialPropertySet.java | 56 ++++-- .../apache/poi/hpsf/SummaryInformation.java | 9 +- src/java/org/apache/poi/hpsf/Thumbnail.java | 22 +-- .../UnexpectedPropertySetTypeException.java | 26 ++- src/java/org/apache/poi/hpsf/Util.java | 16 +- .../poi/hpsf/wellknown/PropertyIDMap.java | 145 ++++++++++----- .../poi/hpsf/wellknown/SectionIDMap.java | 63 ++++--- 21 files changed, 598 insertions(+), 335 deletions(-) diff --git a/.classpath b/.classpath index dff3caf30..6a8406065 100644 --- a/.classpath +++ b/.classpath @@ -1,14 +1,13 @@ - - + + + - - - - - - - + + + + + diff --git a/.project b/.project index 2a90ecdda..13100e35d 100644 --- a/.project +++ b/.project @@ -1,10 +1,15 @@ - POI + POI-Head-1 + + com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder + + + org.eclipse.jdt.core.javabuilder @@ -13,5 +18,6 @@ org.eclipse.jdt.core.javanature + com.atlassw.tools.eclipse.checkstyle.CheckstyleNature diff --git a/src/java/org/apache/poi/hpsf/ClassID.java b/src/java/org/apache/poi/hpsf/ClassID.java index 6d5676703..1aff51b9b 100644 --- a/src/java/org/apache/poi/hpsf/ClassID.java +++ b/src/java/org/apache/poi/hpsf/ClassID.java @@ -55,9 +55,6 @@ */ package org.apache.poi.hpsf; -import java.io.*; -import org.apache.poi.util.LittleEndian; - /** *

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.

*/ + public static final int LENGTH = 16; + /** + * @return The number of bytes occupied by this object in the byte + * stream. + */ public int length() { return LENGTH; @@ -117,10 +120,12 @@ public class ClassID /** *

Gets the bytes making out the class ID. They are returned in * correct order, i.e. big-endian.

+ * + * @return the bytes making out the class ID. */ public byte[] getBytes() { - return bytes; + return bytes; } @@ -153,9 +158,9 @@ public class ClassID bytes[6] = src[7 + offset]; bytes[7] = src[6 + offset]; - /* Read 8 bytes. */ - for (int i = 8; i < 16; i++) - bytes[i] = src[i + offset]; + /* Read 8 bytes. */ + for (int i = 8; i < 16; i++) + bytes[i] = src[i + offset]; return bytes; } @@ -170,30 +175,34 @@ public class ClassID * * @param offset The offset within the dst byte array. * - * @throws ArrayIndexOutOfBoundsException if there is not enough - * room for the class ID in the byte array. There must be at least - * 16 bytes in the byte array after the offset - * position. + * @exception ArrayStoreException if there is not enough room for the class + * ID 16 bytes in the byte array after the offset position. */ public void write(final byte[] dst, final int offset) + throws ArrayStoreException { + /* Check array size: */ + if (dst.length < 16) + throw new ArrayStoreException + ("Destination byte[] must have room for at least 16 bytes, " + + "but has a length of only " + dst.length + "."); /* Write double word. */ - dst[0 + offset] = bytes[3]; - dst[1 + offset] = bytes[2]; - dst[2 + offset] = bytes[1]; - dst[3 + offset] = bytes[0]; + dst[0 + offset] = bytes[3]; + dst[1 + offset] = bytes[2]; + dst[2 + offset] = bytes[1]; + dst[3 + offset] = bytes[0]; /* Write first word. */ - dst[4 + offset] = bytes[5]; - dst[5 + offset] = bytes[4]; + dst[4 + offset] = bytes[5]; + dst[5 + offset] = bytes[4]; /* Write second word. */ - dst[6 + offset] = bytes[7]; - dst[7 + offset] = bytes[6]; + dst[6 + offset] = bytes[7]; + dst[7 + offset] = bytes[6]; - /* Write 8 bytes. */ - for (int i = 8; i < 16; i++) - dst[i + offset] = bytes[i]; + /* Write 8 bytes. */ + for (int i = 8; i < 16; i++) + dst[i + offset] = bytes[i]; } } diff --git a/src/java/org/apache/poi/hpsf/DocumentSummaryInformation.java b/src/java/org/apache/poi/hpsf/DocumentSummaryInformation.java index 92005867a..d1b694f08 100644 --- a/src/java/org/apache/poi/hpsf/DocumentSummaryInformation.java +++ b/src/java/org/apache/poi/hpsf/DocumentSummaryInformation.java @@ -54,9 +54,7 @@ */ package org.apache.poi.hpsf; -import java.io.*; -import java.util.*; -import org.apache.poi.hpsf.wellknown.*; +import org.apache.poi.hpsf.wellknown.PropertyIDMap; /** *

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 + * null.

+ * */ private Throwable reason; /** - *

Creates a new {@link HPSFException}.

+ *

Creates an {@link HPSFException}.

*/ public HPSFException() { @@ -81,8 +85,7 @@ public class HPSFException extends Exception /** - *

Creates a new {@link HPSFException} with a message - * string.

+ *

Creates an {@link HPSFException} with a message string.

* * @param msg The message string. */ @@ -108,8 +111,8 @@ public class HPSFException extends Exception /** - *

Creates a new {@link HPSFException} with a message string - * and a reason.

+ *

Creates an {@link HPSFException} with a message string and a + * reason.

* * @param msg The message string. * @param reason The reason, i.e. a throwable that indirectly diff --git a/src/java/org/apache/poi/hpsf/HPSFRuntimeException.java b/src/java/org/apache/poi/hpsf/HPSFRuntimeException.java index 7fb09274f..d86f8e871 100644 --- a/src/java/org/apache/poi/hpsf/HPSFRuntimeException.java +++ b/src/java/org/apache/poi/hpsf/HPSFRuntimeException.java @@ -66,6 +66,8 @@ package org.apache.poi.hpsf; public class HPSFRuntimeException extends RuntimeException { + /**

The underlying reason for this exception - may be + * null.

*/ private Throwable reason; diff --git a/src/java/org/apache/poi/hpsf/IllegalPropertySetDataException.java b/src/java/org/apache/poi/hpsf/IllegalPropertySetDataException.java index 25764df39..378b1874d 100644 --- a/src/java/org/apache/poi/hpsf/IllegalPropertySetDataException.java +++ b/src/java/org/apache/poi/hpsf/IllegalPropertySetDataException.java @@ -69,6 +69,9 @@ package org.apache.poi.hpsf; public class IllegalPropertySetDataException extends HPSFRuntimeException { + /** + *

Constructor

+ */ public IllegalPropertySetDataException() { super(); @@ -76,6 +79,11 @@ public class IllegalPropertySetDataException extends HPSFRuntimeException + /** + *

Constructor

+ * + * @param msg The exception's message string + */ public IllegalPropertySetDataException(final String msg) { super(msg); @@ -83,6 +91,11 @@ public class IllegalPropertySetDataException extends HPSFRuntimeException + /** + *

Constructor

+ * + * @param reason This exception's underlying reason + */ public IllegalPropertySetDataException(final Throwable reason) { super(reason); @@ -90,10 +103,16 @@ public class IllegalPropertySetDataException extends HPSFRuntimeException + /** + *

Constructor

+ * + * @param msg The exception's message string + * @param reason This exception's underlying reason + */ public IllegalPropertySetDataException(final String msg, final Throwable reason) { - super(msg,reason); + super(msg, reason); } } diff --git a/src/java/org/apache/poi/hpsf/MarkUnsupportedException.java b/src/java/org/apache/poi/hpsf/MarkUnsupportedException.java index 820243075..656f3cab3 100644 --- a/src/java/org/apache/poi/hpsf/MarkUnsupportedException.java +++ b/src/java/org/apache/poi/hpsf/MarkUnsupportedException.java @@ -65,27 +65,46 @@ package org.apache.poi.hpsf; public class MarkUnsupportedException extends HPSFException { + /** + *

Constructor

+ */ public MarkUnsupportedException() { super(); } + /** + *

Constructor

+ * + * @param msg The exception's message string + */ public MarkUnsupportedException(final String msg) { super(msg); } + /** + *

Constructor

+ * + * @param reason This exception's underlying reason + */ public MarkUnsupportedException(final Throwable reason) { super(reason); } + /** + *

Constructor

+ * + * @param msg The exception's message string + * @param reason This exception's underlying reason + */ public MarkUnsupportedException(final String msg, final Throwable reason) { super(msg, reason); } -} +} \ No newline at end of file diff --git a/src/java/org/apache/poi/hpsf/NoPropertySetStreamException.java b/src/java/org/apache/poi/hpsf/NoPropertySetStreamException.java index 1fc2c50ca..cfccbb733 100644 --- a/src/java/org/apache/poi/hpsf/NoPropertySetStreamException.java +++ b/src/java/org/apache/poi/hpsf/NoPropertySetStreamException.java @@ -71,26 +71,45 @@ package org.apache.poi.hpsf; public class NoPropertySetStreamException extends HPSFException { + /** + *

Constructor

+ */ public NoPropertySetStreamException() { super(); } + /** + *

Constructor

+ * + * @param msg The exception's message string + */ public NoPropertySetStreamException(final String msg) { super(msg); } + /** + *

Constructor

+ * + * @param reason This exception's underlying reason + */ public NoPropertySetStreamException(final Throwable reason) { super(reason); } + /** + *

Constructor

+ * + * @param msg The exception's message string + * @param reason This exception's underlying reason + */ public NoPropertySetStreamException(final String msg, - final Throwable reason) + final Throwable reason) { super(msg, reason); } diff --git a/src/java/org/apache/poi/hpsf/NoSingleSectionException.java b/src/java/org/apache/poi/hpsf/NoSingleSectionException.java index da9e2fd8d..9b22c40b0 100644 --- a/src/java/org/apache/poi/hpsf/NoSingleSectionException.java +++ b/src/java/org/apache/poi/hpsf/NoSingleSectionException.java @@ -70,24 +70,43 @@ package org.apache.poi.hpsf; public class NoSingleSectionException extends HPSFRuntimeException { + /** + *

Constructor

+ */ public NoSingleSectionException() { super(); } + /** + *

Constructor

+ * + * @param msg The exception's message string + */ public NoSingleSectionException(final String msg) { super(msg); } + /** + *

Constructor

+ * + * @param reason This exception's underlying reason + */ public NoSingleSectionException(final Throwable reason) { super(reason); } + /** + *

Constructor

+ * + * @param msg The exception's message string + * @param reason This exception's underlying reason + */ public NoSingleSectionException(final String msg, final Throwable reason) { super(msg, reason); diff --git a/src/java/org/apache/poi/hpsf/Property.java b/src/java/org/apache/poi/hpsf/Property.java index 9ea91ae7b..b6d92ebeb 100644 --- a/src/java/org/apache/poi/hpsf/Property.java +++ b/src/java/org/apache/poi/hpsf/Property.java @@ -62,7 +62,8 @@ */ package org.apache.poi.hpsf; -import java.util.*; +import java.util.HashMap; +import java.util.Map; import org.apache.poi.util.LittleEndian; /** @@ -95,9 +96,10 @@ import org.apache.poi.util.LittleEndian; public class Property { - /* Codepage 1200 denotes Unicode. */ - private static int CP_UNICODE = 1200; + /**

Codepage 1200 denotes Unicode.

*/ + private static final int CP_UNICODE = 1200; + /**

The property's ID.

*/ private int id; @@ -113,6 +115,7 @@ public class Property + /**

The property's type.

*/ private long type; @@ -128,6 +131,7 @@ public class Property + /**

The property's value.

*/ private Object value; @@ -156,7 +160,7 @@ public class Property * codepage. It is needed only when reading string values. */ public Property(final int id, final byte[] src, final long offset, - int length, int codepage) + final int length, final int codepage) { this.id = id; @@ -165,7 +169,7 @@ public class Property * property IDs and property names. */ if (id == 0) - { + { value = readDictionary(src, offset, length, codepage); return; } @@ -174,15 +178,15 @@ public class Property type = LittleEndian.getUInt(src, o); o += LittleEndian.INT_SIZE; - try - { - value = TypeReader.read(src, o, length, (int) type); - } - catch (Throwable t) - { - t.printStackTrace(); - value = "*** null ***"; - } + try + { + value = TypeReader.read(src, o, length, (int) type); + } + catch (Throwable t) + { + t.printStackTrace(); + value = "*** null ***"; + } } @@ -199,13 +203,13 @@ public class Property * @return The dictonary */ protected Map readDictionary(final byte[] src, final long offset, - final int length, final int codepage) + final int length, final int codepage) { - /* Check whether "offset" points into the "src" array". */ - if (offset < 0 || offset > src.length) - throw new HPSFRuntimeException - ("Illegal offset " + offset + " while HPSF stream contains " + - length + " bytes."); + /* Check whether "offset" points into the "src" array". */ + if (offset < 0 || offset > src.length) + throw new HPSFRuntimeException + ("Illegal offset " + offset + " while HPSF stream contains " + + length + " bytes."); int o = (int) offset; /* @@ -216,7 +220,7 @@ public class Property final Map m = new HashMap((int) nrEntries, (float) 1.0); for (int i = 0; i < nrEntries; i++) - { + { /* The key. */ final Long id = new Long(LittleEndian.getUInt(src, o)); o += LittleEndian.INT_SIZE; @@ -231,31 +235,44 @@ public class Property /* Read the bytes or characters depending on whether the * character set is Unicode or not. */ - StringBuffer b = new StringBuffer((int) sLength); - for (int j = 0; j < sLength; j++) - if (codepage == CP_UNICODE) - { - final int i1 = o + (j * 2); - final int i2 = i1 + 1; - b.append((char) ((src[i2] << 8) + src[i1])); - } - else - b.append((char) src[o + j]); + StringBuffer b = new StringBuffer((int) sLength); + for (int j = 0; j < sLength; j++) + if (codepage == CP_UNICODE) + { + final int i1 = o + (j * 2); + final int i2 = i1 + 1; + b.append((char) ((src[i2] << 8) + src[i1])); + } + else + b.append((char) src[o + j]); - /* Strip 0x00 characters from the end of the string: */ - while (b.charAt(b.length() - 1) == 0x00) - b.setLength(b.length() - 1); - if (codepage == CP_UNICODE) - { - if (sLength % 2 == 1) - sLength++; - o += (sLength + sLength); - } - else - o += sLength; + /* Strip 0x00 characters from the end of the string: */ + while (b.charAt(b.length() - 1) == 0x00) + b.setLength(b.length() - 1); + if (codepage == CP_UNICODE) + { + if (sLength % 2 == 1) + sLength++; + o += (sLength + sLength); + } + else + o += sLength; m.put(id, b.toString()); } return m; } + + + /** + *

Returns the property's size in bytes. This is always a multiple of + * 4.

+ * + * @return the property's size in bytes + */ + protected int getSize() + { + throw new UnsupportedOperationException("FIXME: Not yet implemented."); + } + } diff --git a/src/java/org/apache/poi/hpsf/PropertySet.java b/src/java/org/apache/poi/hpsf/PropertySet.java index 17eda580a..a0b2f9bc3 100644 --- a/src/java/org/apache/poi/hpsf/PropertySet.java +++ b/src/java/org/apache/poi/hpsf/PropertySet.java @@ -54,10 +54,11 @@ */ package org.apache.poi.hpsf; -import java.io.*; -import java.util.*; -import org.apache.poi.hpsf.wellknown.*; -import org.apache.poi.poifs.filesystem.*; +import java.io.InputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.apache.poi.hpsf.wellknown.SectionIDMap; import org.apache.poi.util.LittleEndian; /** @@ -99,8 +100,8 @@ public class PropertySet /** *

The "byteOrder" field must equal this value.

*/ - final static byte[] BYTE_ORDER_ASSERTION = - new byte[]{(byte) 0xFE, (byte) 0xFF}; + static final byte[] BYTE_ORDER_ASSERTION = + new byte[] {(byte) 0xFE, (byte) 0xFF}; /** *

Specifies this {@link PropertySet}'s byte order. See the @@ -124,8 +125,8 @@ public class PropertySet /** *

The "format" field must equal this value.

*/ - final static byte[] FORMAT_ASSERTION = - new byte[]{(byte) 0x00, (byte) 0x00}; + static final byte[] FORMAT_ASSERTION = + new byte[]{(byte) 0x00, (byte) 0x00}; /** *

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.

+ */ + public static final int OS_WIN16 = 0x0000; + + /** + *

If the OS version field holds this value the property set stream was + * created on a Macintosh system.

+ */ + public static final int OS_MACINTOSH = 0x0001; + + /** + *

If the OS version field holds this value the property set stream was + * created on a 32-bit Windows system.

+ */ + public static final int OS_WIN32 = 0x0002; /** *

Returns the property set stream's low-level "OS version" * field.

* - *

FIXME: Return an int instead - * of a long in the next major version, i.e. when - * incompatible changes are allowed.

- * * @return The property set stream's low-level "OS version" field. */ - public long getOSVersion() + public int getOSVersion() { return osVersion; } @@ -204,13 +215,9 @@ public class PropertySet *

Returns the number of {@link Section}s in the property * set.

* - *

FIXME: Return an int instead - * of a long in the next major version, i.e. when - * incompatible changes are allowed.

- * * @return The number of {@link Section}s in the property set. */ - public long getSectionCount() + public int getSectionCount() { return sectionCount; } @@ -244,7 +251,7 @@ public class PropertySet * writing functionality is implemented.

*/ protected PropertySet() - {} + { } @@ -265,19 +272,21 @@ public class PropertySet * the {@link InputStream#markSupported} method. * @throws IOException if the {@link InputStream} cannot not be * accessed as needed. + * @exception NoPropertySetStreamException if the input stream does not + * contain a property set */ public PropertySet(final InputStream stream) - throws NoPropertySetStreamException, MarkUnsupportedException, - IOException + throws NoPropertySetStreamException, MarkUnsupportedException, + IOException { if (isPropertySetStream(stream)) - { + { final int avail = stream.available(); final byte[] buffer = new byte[avail]; stream.read(buffer, 0, buffer.length); init(buffer, 0, buffer.length); } - else + else throw new NoPropertySetStreamException(); } @@ -297,11 +306,11 @@ public class PropertySet * property set stream. */ public PropertySet(final byte[] stream, final int offset, final int length) - throws NoPropertySetStreamException + throws NoPropertySetStreamException { if (isPropertySetStream(stream, offset, length)) init(stream, offset, length); - else + else throw new NoPropertySetStreamException(); } @@ -337,9 +346,10 @@ public class PropertySet * stream, else 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.

+ */ private boolean wasNull; diff --git a/src/java/org/apache/poi/hpsf/SpecialPropertySet.java b/src/java/org/apache/poi/hpsf/SpecialPropertySet.java index 286180e9d..027944934 100644 --- a/src/java/org/apache/poi/hpsf/SpecialPropertySet.java +++ b/src/java/org/apache/poi/hpsf/SpecialPropertySet.java @@ -54,8 +54,7 @@ */ package org.apache.poi.hpsf; -import java.util.*; -import org.apache.poi.util.LittleEndian; +import java.util.List; /** *

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.

+ */ private PropertySet delegate; - public SpecialPropertySet(PropertySet ps) + /** + *

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, or null 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) {