aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Beeker <kiwiwings@apache.org>2016-11-27 13:12:00 +0000
committerAndreas Beeker <kiwiwings@apache.org>2016-11-27 13:12:00 +0000
commitc47c780b63abf187b71894d99990e232c3d3df3a (patch)
treefa968a20dbf3e06a0d90d086f65e23718e2abd29
parent39a60aa3e3a1b4c490266cabcce3021a39917985 (diff)
downloadpoi-c47c780b63abf187b71894d99990e232c3d3df3a.tar.gz
poi-c47c780b63abf187b71894d99990e232c3d3df3a.zip
SonarCube fixes - visibility of member attributes
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1771583 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/java/org/apache/poi/hpsf/ClassID.java82
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/HDGFLZWCompressor.java20
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/chunks/Chunk.java2
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkFactory.java8
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeader.java51
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV11.java67
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV4V5.java12
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV6.java28
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkTrailer.java6
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/dev/VSDDumper.java4
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/pointers/Pointer.java31
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java20
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV5.java37
-rw-r--r--src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV6.java11
-rw-r--r--src/scratchpad/src/org/apache/poi/hpbf/model/EscherPart.java5
-rw-r--r--src/scratchpad/src/org/apache/poi/hpbf/model/HPBFPart.java8
-rw-r--r--src/scratchpad/src/org/apache/poi/hpbf/model/QuillContents.java1
-rw-r--r--src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCBit.java19
-rw-r--r--src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCPLCBit.java115
-rw-r--r--src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCTextBit.java7
-rw-r--r--src/scratchpad/testcases/org/apache/poi/hdgf/streams/StreamTest.java8
21 files changed, 323 insertions, 219 deletions
diff --git a/src/java/org/apache/poi/hpsf/ClassID.java b/src/java/org/apache/poi/hpsf/ClassID.java
index 1c06db0155..6fca6dd188 100644
--- a/src/java/org/apache/poi/hpsf/ClassID.java
+++ b/src/java/org/apache/poi/hpsf/ClassID.java
@@ -17,6 +17,8 @@
package org.apache.poi.hpsf;
+import java.util.Arrays;
+
import org.apache.poi.util.HexDump;
import org.apache.poi.util.StringUtil;
@@ -40,12 +42,15 @@ public class ClassID
public static final ClassID POWERPOINT95 = new ClassID("{EA7BAE70-FB3B-11CD-A903-00AA00510EA3}");
public static final ClassID EQUATION30 = new ClassID("{0002CE02-0000-0000-C000-000000000046}");
+ /** <p>The number of bytes occupied by this object in the byte
+ * stream.</p> */
+ public static final int LENGTH = 16;
/**
* <p>The bytes making out the class ID in correct order,
* i.e. big-endian.</p>
*/
- protected byte[] bytes;
+ private final byte[] bytes = new byte[LENGTH];
@@ -56,8 +61,7 @@ public class ClassID
* @param src The byte array to read from.
* @param offset The offset of the first byte to read.
*/
- public ClassID(final byte[] src, final int offset)
- {
+ public ClassID(final byte[] src, final int offset) {
read(src, offset);
}
@@ -66,11 +70,8 @@ public class ClassID
* <p>Creates a {@link ClassID} and initializes its value with
* 0x00 bytes.</p>
*/
- public ClassID()
- {
- bytes = new byte[LENGTH];
- for (int i = 0; i < LENGTH; i++)
- bytes[i] = 0x00;
+ public ClassID() {
+ Arrays.fill(bytes, (byte)0);
}
@@ -81,7 +82,6 @@ public class ClassID
* @param externalForm representation of the Class ID represented by this object.
*/
public ClassID(String externalForm) {
- bytes = new byte[LENGTH];
String clsStr = externalForm.replaceAll("[{}-]", "");
for (int i=0; i<clsStr.length(); i+=2) {
bytes[i/2] = (byte)Integer.parseInt(clsStr.substring(i, i+2), 16);
@@ -89,16 +89,11 @@ public class ClassID
}
- /** <p>The number of bytes occupied by this object in the byte
- * stream.</p> */
- public static final int LENGTH = 16;
-
/**
* @return The number of bytes occupied by this object in the byte
* stream.
*/
- public int length()
- {
+ public int length() {
return LENGTH;
}
@@ -110,8 +105,7 @@ public class ClassID
*
* @return the bytes making out the class ID.
*/
- public byte[] getBytes()
- {
+ public byte[] getBytes() {
return bytes;
}
@@ -123,10 +117,8 @@ public class ClassID
* @param bytes The bytes making out the class ID in big-endian format. They
* are copied without their order being changed.
*/
- public void setBytes(final byte[] bytes)
- {
- for (int i = 0; i < this.bytes.length; i++)
- this.bytes[i] = bytes[i];
+ public void setBytes(final byte[] bytes) {
+ System.arraycopy(bytes, 0, this.bytes, 0, LENGTH);
}
@@ -141,10 +133,7 @@ public class ClassID
*
* @return A byte array containing the class ID.
*/
- public byte[] read(final byte[] src, final int offset)
- {
- bytes = new byte[16];
-
+ public byte[] read(final byte[] src, final int offset) {
/* Read double word. */
bytes[0] = src[3 + offset];
bytes[1] = src[2 + offset];
@@ -160,8 +149,7 @@ public class ClassID
bytes[7] = src[6 + offset];
/* Read 8 bytes. */
- for (int i = 8; i < 16; i++)
- bytes[i] = src[i + offset];
+ System.arraycopy(src, 8 + offset, bytes, 8, 8);
return bytes;
}
@@ -180,13 +168,14 @@ public class ClassID
* ID 16 bytes in the byte array after the <var>offset</var> position.
*/
public void write(final byte[] dst, final int offset)
- throws ArrayStoreException
- {
+ throws ArrayStoreException {
/* Check array size: */
- if (dst.length < 16)
+ if (dst.length < LENGTH) {
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];
@@ -202,8 +191,7 @@ public class ClassID
dst[7 + offset] = bytes[6];
/* Write 8 bytes. */
- for (int i = 8; i < 16; i++)
- dst[i + offset] = bytes[i];
+ System.arraycopy(bytes, 8, dst, 8 + offset, 8);
}
@@ -217,16 +205,19 @@ public class ClassID
* <code>false</code>.
*/
@Override
- public boolean equals(final Object o)
- {
- if (o == null || !(o instanceof ClassID))
+ public boolean equals(final Object o) {
+ if (o == null || !(o instanceof ClassID)) {
return false;
+ }
final ClassID cid = (ClassID) o;
- if (bytes.length != cid.bytes.length)
+ if (bytes.length != cid.bytes.length) {
return false;
- for (int i = 0; i < bytes.length; i++)
- if (bytes[i] != cid.bytes[i])
+ }
+ for (int i = 0; i < bytes.length; i++) {
+ if (bytes[i] != cid.bytes[i]) {
return false;
+ }
+ }
return true;
}
@@ -236,8 +227,7 @@ public class ClassID
* @see Object#hashCode()
*/
@Override
- public int hashCode()
- {
+ public int hashCode() {
return new String(bytes, StringUtil.UTF8).hashCode();
}
@@ -248,18 +238,16 @@ public class ClassID
* @return String representation of the Class ID represented by this object.
*/
@Override
- public String toString()
- {
- StringBuffer sbClassId = new StringBuffer(38);
+ public String toString() {
+ StringBuilder sbClassId = new StringBuilder(38);
sbClassId.append('{');
- for (int i = 0; i < 16; i++)
- {
+ for (int i = 0; i < LENGTH; i++) {
sbClassId.append(HexDump.toHex(bytes[i]));
- if (i == 3 || i == 5 || i == 7 || i == 9)
+ if (i == 3 || i == 5 || i == 7 || i == 9) {
sbClassId.append('-');
+ }
}
sbClassId.append('}');
return sbClassId.toString();
}
-
}
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/HDGFLZWCompressor.java b/src/scratchpad/src/org/apache/poi/hdgf/HDGFLZWCompressor.java
index 53215de88e..d79c43c87b 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/HDGFLZWCompressor.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/HDGFLZWCompressor.java
@@ -30,35 +30,35 @@ import java.io.OutputStream;
* TODO Fix this, as it starts to go wrong on
* large streams
*/
-final class HDGFLZWCompressor {
+/* package */ final class HDGFLZWCompressor {
// We use 12 bit codes:
// * 0-255 are real bytes
// * 256-4095 are the substring codes
// Java handily initialises our buffer / dictionary
// to all zeros
- byte[] dict = new byte[4096];
+ private byte[] dict = new byte[4096];
// The next block of data to be written out, minus
// its mask byte
- byte[] buffer = new byte[16];
+ private byte[] buffer = new byte[16];
// And how long it is
// (Un-compressed codes are 1 byte each, compressed codes
// are two)
- int bufferLen = 0;
+ private int bufferLen = 0;
// The raw length of a code is limited to 4 bits + 2
- byte[] rawCode = new byte[18];
+ private byte[] rawCode = new byte[18];
// And how much we're using
- int rawCodeLen = 0;
+ private int rawCodeLen = 0;
// How far through the input and output streams we are
- int posInp = 0;
- int posOut = 0;
+ private int posInp = 0;
+ private int posOut = 0;
// What the next mask byte to output will be
- int nextMask = 0;
+ private int nextMask = 0;
// And how many bits we've already set
- int maskBitsSet = 0;
+ private int maskBitsSet = 0;
public HDGFLZWCompressor() {}
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/Chunk.java b/src/scratchpad/src/org/apache/poi/hdgf/chunks/Chunk.java
index 23ec352783..ce92ac8dc9 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/chunks/Chunk.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/Chunk.java
@@ -95,7 +95,7 @@ public final class Chunk {
public int getOnDiskSize() {
int size = header.getSizeInBytes() + contents.length;
if(trailer != null) {
- size += trailer.trailerData.length;
+ size += trailer.getTrailerData().length;
}
if(separator != null) {
size += separator.separatorData.length;
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkFactory.java b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkFactory.java
index 4b69576ee3..642cdf488e 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkFactory.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkFactory.java
@@ -130,7 +130,7 @@ public final class ChunkFactory {
ChunkHeader header =
ChunkHeader.createChunkHeader(version, data, offset);
// Sanity check
- if(header.length < 0) {
+ if(header.getLength() < 0) {
throw new IllegalArgumentException("Found a chunk with a negative length, which isn't allowed");
}
@@ -144,14 +144,14 @@ public final class ChunkFactory {
"Header called for " + header.getLength() +" bytes, but that would take us past the end of the data!");
endOfDataPos = data.length;
- header.length = data.length - offset - header.getSizeInBytes();
+ header.setLength(data.length - offset - header.getSizeInBytes());
if(header.hasTrailer()) {
- header.length -= 8;
+ header.setLength(header.getLength() - 8);
endOfDataPos -= 8;
}
if(header.hasSeparator()) {
- header.length -= 4;
+ header.setLength(header.getLength() - 4);
endOfDataPos -= 4;
}
}
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeader.java b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeader.java
index 4b38366f7b..df7c9940bd 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeader.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeader.java
@@ -25,10 +25,10 @@ import java.nio.charset.Charset;
* A chunk header
*/
public abstract class ChunkHeader {
- protected int type;
- protected int id;
- protected int length;
- protected int unknown1;
+ private int type;
+ private int id;
+ private int length;
+ private int unknown1;
/**
* Creates the appropriate ChunkHeader for the Chunk Header at
@@ -42,23 +42,23 @@ public abstract class ChunkHeader {
} else {
ch = new ChunkHeaderV6();
}
- ch.type = (int)LittleEndian.getUInt(data, offset + 0);
- ch.id = (int)LittleEndian.getUInt(data, offset + 4);
- ch.unknown1 = (int)LittleEndian.getUInt(data, offset + 8);
- ch.length = (int)LittleEndian.getUInt(data, offset + 12);
- ch.unknown2 = LittleEndian.getShort(data, offset + 16);
- ch.unknown3 = LittleEndian.getUByte(data, offset + 18);
+ ch.setType((int)LittleEndian.getUInt(data, offset + 0));
+ ch.setId((int)LittleEndian.getUInt(data, offset + 4));
+ ch.setUnknown1((int)LittleEndian.getUInt(data, offset + 8));
+ ch.setLength((int)LittleEndian.getUInt(data, offset + 12));
+ ch.setUnknown2(LittleEndian.getShort(data, offset + 16));
+ ch.setUnknown3(LittleEndian.getUByte(data, offset + 18));
return ch;
} else if(documentVersion == 5 || documentVersion == 4) {
ChunkHeaderV4V5 ch = new ChunkHeaderV4V5();
- ch.type = LittleEndian.getShort(data, offset + 0);
- ch.id = LittleEndian.getShort(data, offset + 2);
- ch.unknown2 = LittleEndian.getUByte(data, offset + 4);
- ch.unknown3 = LittleEndian.getUByte(data, offset + 5);
- ch.unknown1 = LittleEndian.getShort(data, offset + 6);
- ch.length = (int)LittleEndian.getUInt(data, offset + 8);
+ ch.setType(LittleEndian.getShort(data, offset + 0));
+ ch.setId(LittleEndian.getShort(data, offset + 2));
+ ch.setUnknown2(LittleEndian.getUByte(data, offset + 4));
+ ch.setUnknown3(LittleEndian.getUByte(data, offset + 5));
+ ch.setUnknown1(LittleEndian.getShort(data, offset + 6));
+ ch.setLength((int)LittleEndian.getUInt(data, offset + 8));
return ch;
} else {
@@ -90,6 +90,7 @@ public abstract class ChunkHeader {
public int getId() {
return id;
}
+
/**
* Returns the length of the trunk, excluding the length
* of the header, trailer or separator.
@@ -97,6 +98,7 @@ public abstract class ChunkHeader {
public int getLength() {
return length;
}
+
/**
* Returns the type of the chunk, which affects the
* mandatory information
@@ -104,7 +106,24 @@ public abstract class ChunkHeader {
public int getType() {
return type;
}
+
public int getUnknown1() {
return unknown1;
}
+
+ void setType(int type) {
+ this.type = type;
+ }
+
+ void setId(int id) {
+ this.id = id;
+ }
+
+ void setLength(int length) {
+ this.length = length;
+ }
+
+ void setUnknown1(int unknown1) {
+ this.unknown1 = unknown1;
+ }
}
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV11.java b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV11.java
index b3d84aa503..ca243c9963 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV11.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV11.java
@@ -23,30 +23,45 @@ import java.nio.charset.Charset;
* A chunk header from v11+
*/
public final class ChunkHeaderV11 extends ChunkHeaderV6 {
- /**
- * Does the chunk have a separator?
- */
- public boolean hasSeparator() {
- // For some reason, there are two types that don't have a
- // separator despite the flags that indicate they do
- if(type == 0x1f || type == 0xc9) { return false; }
-
- // If there's a trailer, there's a separator
- if(hasTrailer()) { return true; }
-
- if(unknown2 == 2 && unknown3 == 0x55) { return true; }
- if(unknown2 == 2 && unknown3 == 0x54 && type == 0xa9) { return true; }
- if(unknown2 == 2 && unknown3 == 0x54 && type == 0xaa) { return true; }
- if(unknown2 == 2 && unknown3 == 0x54 && type == 0xb4) { return true; }
- if(unknown2 == 2 && unknown3 == 0x54 && type == 0xb6) { return true; }
- if(unknown2 == 3 && unknown3 != 0x50) { return true; }
- if(type == 0x69) { return true; }
-
- return false;
- }
-
- @Override
- public Charset getChunkCharset() {
- return Charset.forName("UTF-16LE");
- }
+ /**
+ * Does the chunk have a separator?
+ */
+ public boolean hasSeparator() {
+ short unknown2 = getUnknown2();
+ short unknown3 = getUnknown3();
+
+ switch (getType()) {
+ case 0x1f: case 0xc9:
+ // For some reason, there are two types that don't have a
+ // separator despite the flags that indicate they do
+ return false;
+
+ case 0x69:
+ return true;
+
+ case 0xa9: case 0xaa: case 0xb4: case 0xb6:
+ if (unknown2 == 2 && unknown3 == 0x54) {
+ return true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if (
+ (unknown2 == 2 && unknown3 == 0x55) ||
+ (unknown2 == 3 && unknown3 != 0x50)
+ ) {
+ return true;
+ }
+
+ // If there's a trailer, there's a separator
+ return hasTrailer();
+ }
+
+ @Override
+ public Charset getChunkCharset() {
+ return Charset.forName("UTF-16LE");
+ }
}
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV4V5.java b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV4V5.java
index bba6a87ddd..b4eb9d83d7 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV4V5.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV4V5.java
@@ -23,8 +23,8 @@ import java.nio.charset.Charset;
* A chunk header from v4 or v5
*/
public final class ChunkHeaderV4V5 extends ChunkHeader {
- protected short unknown2;
- protected short unknown3;
+ private short unknown2;
+ private short unknown3;
public short getUnknown2() {
return unknown2;
@@ -61,4 +61,12 @@ public final class ChunkHeaderV4V5 extends ChunkHeader {
public Charset getChunkCharset() {
return Charset.forName("ASCII");
}
+
+ void setUnknown2(short unknown2) {
+ this.unknown2 = unknown2;
+ }
+
+ void setUnknown3(short unknown3) {
+ this.unknown3 = unknown3;
+ }
}
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV6.java b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV6.java
index 96546c780b..2a221a7028 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV6.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkHeaderV6.java
@@ -23,8 +23,8 @@ import java.nio.charset.Charset;
* A chunk header from v6
*/
public class ChunkHeaderV6 extends ChunkHeader {
- protected short unknown2;
- protected short unknown3;
+ private short unknown2;
+ private short unknown3;
public short getUnknown2() {
return unknown2;
@@ -45,15 +45,15 @@ public class ChunkHeaderV6 extends ChunkHeader {
* Does the chunk have a trailer?
*/
public boolean hasTrailer() {
- if(unknown1 != 0 || type == 0x71 || type == 0x70) {
- return true;
- }
- if(type == 0x6b || type == 0x6a || type == 0x69 || type == 0x66
- || type == 0x65 || type == 0x2c) {
- return true;
- }
- return false;
+ switch (getType()) {
+ case 0x2c: case 0x65: case 0x66: case 0x69:
+ case 0x6a: case 0x6b: case 0x70: case 0x71:
+ return true;
+ default:
+ return (getUnknown1() != 0);
+ }
}
+
/**
* Does the chunk have a separator?
*/
@@ -66,4 +66,12 @@ public class ChunkHeaderV6 extends ChunkHeader {
public Charset getChunkCharset() {
return Charset.forName("ASCII");
}
+
+ void setUnknown2(short unknown2) {
+ this.unknown2 = unknown2;
+ }
+
+ void setUnknown3(short unknown3) {
+ this.unknown3 = unknown3;
+ }
}
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkTrailer.java b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkTrailer.java
index ad3441d88d..a4c9e178c2 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkTrailer.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkTrailer.java
@@ -21,7 +21,7 @@ package org.apache.poi.hdgf.chunks;
* A trailer that follows a chunk
*/
public final class ChunkTrailer {
- protected byte[] trailerData;
+ private byte[] trailerData;
public ChunkTrailer(byte[] data, int offset) {
trailerData = new byte[8];
@@ -31,4 +31,8 @@ public final class ChunkTrailer {
public String toString() {
return "<ChunkTrailer of length " + trailerData.length + ">";
}
+
+ byte[] getTrailerData() {
+ return trailerData;
+ }
}
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/dev/VSDDumper.java b/src/scratchpad/src/org/apache/poi/hdgf/dev/VSDDumper.java
index 62f2b36e59..26663e50f1 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/dev/VSDDumper.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/dev/VSDDumper.java
@@ -37,8 +37,8 @@ import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
public final class VSDDumper {
final static String tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
- final PrintStream ps;
- final HDGFDiagram hdgf;
+ private final PrintStream ps;
+ private final HDGFDiagram hdgf;
VSDDumper(PrintStream ps, HDGFDiagram hdgf) {
this.ps = ps;
this.hdgf = hdgf;
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/pointers/Pointer.java b/src/scratchpad/src/org/apache/poi/hdgf/pointers/Pointer.java
index 69704f24ee..06db8781b0 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/pointers/Pointer.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/pointers/Pointer.java
@@ -22,11 +22,11 @@ package org.apache.poi.hdgf.pointers;
* blocks elsewhere in the file
*/
public abstract class Pointer {
- protected int type;
- protected int address;
- protected int offset;
- protected int length;
- protected short format;
+ private int type;
+ private int address;
+ private int offset;
+ private int length;
+ private short format;
public int getAddress() {
return address;
@@ -53,4 +53,25 @@ public abstract class Pointer {
public abstract boolean destinationHasPointers();
public abstract boolean destinationHasChunks();
public abstract boolean destinationCompressed();
+
+ protected void setType(int type) {
+ this.type = type;
+ }
+ protected void setAddress(int address) {
+ this.address = address;
+ }
+ protected void setOffset(int offset) {
+ this.offset = offset;
+ }
+ protected void setLength(int length) {
+ this.length = length;
+ }
+ protected void setFormat(short format) {
+ this.format = format;
+ }
+
+ protected boolean isFormatBetween(int min, int max) {
+ return (min <= format && format < max);
+ }
+
}
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java b/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java
index a151334fe0..bb1d064369 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerFactory.java
@@ -38,20 +38,20 @@ public final class PointerFactory {
Pointer p;
if(version >= 6) {
p = new PointerV6();
- p.type = LittleEndian.getInt(data, offset+0);
- p.address = (int)LittleEndian.getUInt(data, offset+4);
- p.offset = (int)LittleEndian.getUInt(data, offset+8);
- p.length = (int)LittleEndian.getUInt(data, offset+12);
- p.format = LittleEndian.getShort(data, offset+16);
+ p.setType(LittleEndian.getInt(data, offset+0));
+ p.setAddress((int)LittleEndian.getUInt(data, offset+4));
+ p.setOffset((int)LittleEndian.getUInt(data, offset+8));
+ p.setLength((int)LittleEndian.getUInt(data, offset+12));
+ p.setFormat(LittleEndian.getShort(data, offset+16));
return p;
} else if(version == 5) {
p = new PointerV5();
- p.type = LittleEndian.getShort(data, offset+0);
- p.format = LittleEndian.getShort(data, offset+2);
- p.address = (int)LittleEndian.getUInt(data, offset+4);
- p.offset = (int)LittleEndian.getUInt(data, offset+8);
- p.length = (int)LittleEndian.getUInt(data, offset+12);
+ p.setType(LittleEndian.getShort(data, offset+0));
+ p.setFormat(LittleEndian.getShort(data, offset+2));
+ p.setAddress((int)LittleEndian.getUInt(data, offset+4));
+ p.setOffset((int)LittleEndian.getUInt(data, offset+8));
+ p.setLength((int)LittleEndian.getUInt(data, offset+12));
return p;
} else {
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV5.java b/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV5.java
index 6eaf0d44ec..d276b909de 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV5.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV5.java
@@ -25,33 +25,34 @@ import org.apache.poi.util.LittleEndian;
public final class PointerV5 extends Pointer {
// TODO Are these getters correct?
public boolean destinationHasStrings() {
- return (0x40 <= format && format < 0x50);
+ return isFormatBetween(0x40, 0x50);
}
+
public boolean destinationHasPointers() {
- if(type == 20) {
- return true;
+ switch (getType()) {
+ case 20:
+ return true;
+ case 22:
+ return false;
+ default:
+ return isFormatBetween(0x1d, 0x1f) || isFormatBetween(0x50, 0x60);
}
- if(type == 22) {
- return false;
- }
- if(format == 0x1d || format == 0x1e) {
- return true;
- }
- return (0x50 <= format && format < 0x60);
}
+
public boolean destinationHasChunks() {
- if (type == 21) {
- return true;
- }
- if (type == 24) {
- return true;
+ switch (getType()) {
+ case 21:
+ return true;
+ case 24:
+ return true;
+ default:
+ return isFormatBetween(0xd0, 0xdf);
}
- return (0xd0 <= format && format < 0xdf);
}
public boolean destinationCompressed() {
// Apparently, it's the second least significant bit
- return (format & 2) > 0;
+ return (getFormat() & 2) > 0;
}
/**
@@ -63,7 +64,7 @@ public final class PointerV5 extends Pointer {
* Depends on the type only, not stored
*/
public int getNumPointersOffset(byte[] data) {
- switch (type) {
+ switch (getType()) {
case 0x1d:
case 0x4e:
return 30;
diff --git a/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV6.java b/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV6.java
index b240a0c9bb..9983c4ccd4 100644
--- a/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV6.java
+++ b/src/scratchpad/src/org/apache/poi/hdgf/pointers/PointerV6.java
@@ -24,20 +24,19 @@ import org.apache.poi.util.LittleEndian;
*/
public final class PointerV6 extends Pointer {
public boolean destinationHasStrings() {
- return (0x40 <= format && format < 0x50);
+ return isFormatBetween(0x40, 0x50);
}
+
public boolean destinationHasPointers() {
- if(type == 20) return true;
- if(format == 0x1d || format == 0x1e) return true;
- return (0x50 <= format && format < 0x60);
+ return (getType() == 20) || isFormatBetween(0x1d, 0x1f) || isFormatBetween(0x50, 0x60);
}
public boolean destinationHasChunks() {
- return (0xd0 <= format && format < 0xdf);
+ return isFormatBetween(0xd0, 0xdf);
}
public boolean destinationCompressed() {
// Apparently, it's the second least significant bit
- return (format & 2) > 0;
+ return (getFormat() & 2) > 0;
}
/**
diff --git a/src/scratchpad/src/org/apache/poi/hpbf/model/EscherPart.java b/src/scratchpad/src/org/apache/poi/hpbf/model/EscherPart.java
index 26fb1d61d4..47931b8a5b 100644
--- a/src/scratchpad/src/org/apache/poi/hpbf/model/EscherPart.java
+++ b/src/scratchpad/src/org/apache/poi/hpbf/model/EscherPart.java
@@ -42,6 +42,7 @@ public abstract class EscherPart extends HPBFPart {
new DefaultEscherRecordFactory();
ArrayList<EscherRecord> ec = new ArrayList<EscherRecord>();
+ byte data[] = getData();
int left = data.length;
while(left > 0) {
EscherRecord er = erf.createRecord(data, 0);
@@ -68,12 +69,14 @@ public abstract class EscherPart extends HPBFPart {
size += records[i].getRecordSize();
}
- data = new byte[size];
+ byte data[] = new byte[size];
size = 0;
for(int i=0; i<records.length; i++) {
int thisSize =
records[i].serialize(size, data);
size += thisSize;
}
+
+ setData(data);
}
}
diff --git a/src/scratchpad/src/org/apache/poi/hpbf/model/HPBFPart.java b/src/scratchpad/src/org/apache/poi/hpbf/model/HPBFPart.java
index 4379f4a81f..2cbc6bcd0e 100644
--- a/src/scratchpad/src/org/apache/poi/hpbf/model/HPBFPart.java
+++ b/src/scratchpad/src/org/apache/poi/hpbf/model/HPBFPart.java
@@ -31,7 +31,7 @@ import org.apache.poi.util.IOUtils;
* for all of them.
*/
public abstract class HPBFPart {
- protected byte[] data;
+ private byte[] data;
/**
* @param path the path to the part, eg Contents or Quill, QuillSub, CONTENTS
*/
@@ -94,7 +94,11 @@ public abstract class HPBFPart {
* Returns the raw data that makes up
* this document part.
*/
- public byte[] getData() { return data; }
+ public final byte[] getData() { return data; }
+
+ protected final void setData(byte data[]) {
+ this.data = data.clone();
+ }
/**
* Returns
diff --git a/src/scratchpad/src/org/apache/poi/hpbf/model/QuillContents.java b/src/scratchpad/src/org/apache/poi/hpbf/model/QuillContents.java
index 3494d9819d..8e003811f6 100644
--- a/src/scratchpad/src/org/apache/poi/hpbf/model/QuillContents.java
+++ b/src/scratchpad/src/org/apache/poi/hpbf/model/QuillContents.java
@@ -39,6 +39,7 @@ public final class QuillContents extends HPBFPart {
// Now parse the first 512 bytes, and produce
// all our bits
+ byte data[] = getData();
// Check first 8 bytes
String f8 = new String(data, 0, 8, LocaleUtil.CHARSET_1252);
diff --git a/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCBit.java b/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCBit.java
index c2e5334f08..5dd2a079f1 100644
--- a/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCBit.java
+++ b/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCBit.java
@@ -21,15 +21,15 @@ package org.apache.poi.hpbf.model.qcbits;
* Parent of all Quill CONTENTS bits
*/
public abstract class QCBit {
- protected String thingType;
- protected String bitType;
- protected byte[] data;
+ private String thingType;
+ private String bitType;
+ private byte[] data;
- protected int optA;
- protected int optB;
- protected int optC;
+ private int optA;
+ private int optB;
+ private int optC;
- protected int dataOffset;
+ private int dataOffset;
public QCBit(String thingType, String bitType, byte[] data) {
this.thingType = thingType;
@@ -47,7 +47,10 @@ public abstract class QCBit {
* or PLC
*/
public String getBitType() { return bitType; }
- public byte[] getData() { return data; }
+ public final byte[] getData() { return data; }
+ protected final void setData(byte data[]) {
+ this.data = data.clone();
+ }
public int getOptA() {
return optA;
diff --git a/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCPLCBit.java b/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCPLCBit.java
index 3b7975505c..29426cda78 100644
--- a/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCPLCBit.java
+++ b/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCPLCBit.java
@@ -26,18 +26,18 @@ import org.apache.poi.util.StringUtil;
* format is determined by the type of the PLCs.
*/
public abstract class QCPLCBit extends QCBit {
- protected int numberOfPLCs;
- protected int typeOfPLCS;
+ private int numberOfPLCs;
+ private int typeOfPLCS;
/**
* The data which goes before the main PLC entries.
* This is apparently always made up of 2 byte
* un-signed ints..
*/
- protected int[] preData;
+ private int[] preData;
/** The first value of each PLC, normally 4 bytes */
- protected long[] plcValA;
+ private long[] plcValA;
/** The second value of each PLC, normally 4 bytes */
- protected long[] plcValB;
+ private long[] plcValB;
private QCPLCBit(String thingType, String bitType, byte[] data) {
@@ -74,7 +74,19 @@ public abstract class QCPLCBit extends QCBit {
return plcValB;
}
+ final void setPreData(int preData[]) {
+ this.preData = preData.clone();
+ }
+
+ final void setPlcValA(long[] plcValA) {
+ this.plcValA = plcValA.clone();
+ }
+ final void setPlcValB(long[] plcValB) {
+ this.plcValB = plcValB.clone();
+ }
+
+
public static QCPLCBit createQCPLCBit(String thingType, String bitType, byte[] data) {
// Grab the type
@@ -103,17 +115,23 @@ public abstract class QCPLCBit extends QCBit {
super(thingType, bitType, data);
// Grab our 4x pre-data
- preData = new int[4];
- preData[0] = LittleEndian.getUShort(data, 8+0);
- preData[1] = LittleEndian.getUShort(data, 8+2);
- preData[2] = LittleEndian.getUShort(data, 8+4);
- preData[3] = LittleEndian.getUShort(data, 8+6);
-
- // And grab the 2 byte values
- for(int i=0; i<numberOfPLCs; i++) {
+ int preData[] = {
+ LittleEndian.getUShort(data, 8+0),
+ LittleEndian.getUShort(data, 8+2),
+ LittleEndian.getUShort(data, 8+4),
+ LittleEndian.getUShort(data, 8+6)
+ };
+ setPreData(preData);
+
+ // And grab the 2 byte values
+ int cntPlcs = getNumberOfPLCs();
+ long plcValA[] = new long[cntPlcs], plcValB[] = new long[cntPlcs];
+ for(int i=0; i<cntPlcs; i++) {
plcValA[i] = LittleEndian.getUShort(data, 16+(4*i));
plcValB[i] = LittleEndian.getUShort(data, 16+(4*i)+2);
}
+ setPlcValA(plcValA);
+ setPlcValB(plcValB);
}
}
@@ -126,17 +144,23 @@ public abstract class QCPLCBit extends QCBit {
super(thingType, bitType, data);
// Grab our 4x pre-data
- preData = new int[4];
- preData[0] = LittleEndian.getUShort(data, 8+0);
- preData[1] = LittleEndian.getUShort(data, 8+2);
- preData[2] = LittleEndian.getUShort(data, 8+4);
- preData[3] = LittleEndian.getUShort(data, 8+6);
+ int preData[] = {
+ LittleEndian.getUShort(data, 8+0),
+ LittleEndian.getUShort(data, 8+2),
+ LittleEndian.getUShort(data, 8+4),
+ LittleEndian.getUShort(data, 8+6)
+ };
+ setPreData(preData);
// And grab the 4 byte values
- for(int i=0; i<numberOfPLCs; i++) {
+ int cntPlcs = getNumberOfPLCs();
+ long plcValA[] = new long[cntPlcs], plcValB[] = new long[cntPlcs];
+ for(int i=0; i<cntPlcs; i++) {
plcValA[i] = LittleEndian.getUInt(data, 16+(8*i));
plcValB[i] = LittleEndian.getUInt(data, 16+(8*i)+4);
}
+ setPlcValA(plcValA);
+ setPlcValB(plcValB);
}
}
@@ -149,20 +173,26 @@ public abstract class QCPLCBit extends QCBit {
super(thingType, bitType, data);
// Grab our 7x pre-data
- preData = new int[7];
- preData[0] = LittleEndian.getUShort(data, 8+0);
- preData[1] = LittleEndian.getUShort(data, 8+2);
- preData[2] = LittleEndian.getUShort(data, 8+4);
- preData[3] = LittleEndian.getUShort(data, 8+6);
- preData[4] = LittleEndian.getUShort(data, 8+8);
- preData[5] = LittleEndian.getUShort(data, 8+10);
- preData[6] = LittleEndian.getUShort(data, 8+12);
+ int preData[] = {
+ LittleEndian.getUShort(data, 8+0),
+ LittleEndian.getUShort(data, 8+2),
+ LittleEndian.getUShort(data, 8+4),
+ LittleEndian.getUShort(data, 8+6),
+ LittleEndian.getUShort(data, 8+8),
+ LittleEndian.getUShort(data, 8+10),
+ LittleEndian.getUShort(data, 8+12)
+ };
+ setPreData(preData);
// And grab the 4 byte values
- for(int i=0; i<numberOfPLCs; i++) {
+ int cntPlcs = getNumberOfPLCs();
+ long plcValA[] = new long[cntPlcs], plcValB[] = new long[cntPlcs];
+ for(int i=0; i<cntPlcs; i++) {
plcValA[i] = LittleEndian.getUInt(data, 22+(8*i));
plcValB[i] = LittleEndian.getUInt(data, 22+(8*i)+4);
}
+ setPlcValA(plcValA);
+ setPlcValB(plcValB);
}
}
@@ -183,37 +213,38 @@ public abstract class QCPLCBit extends QCBit {
private Type12(String thingType, String bitType, byte[] data) {
super(thingType, bitType, data);
+ int cntPlcs = getNumberOfPLCs();
+
// How many hyperlinks do we really have?
// (zero hyperlinks gets numberOfPLCs=1)
- if(data.length == 0x34) {
- hyperlinks = new String[0];
- } else {
- hyperlinks = new String[numberOfPLCs];
- }
+ hyperlinks = new String[data.length == 0x34 ? 0 : cntPlcs];
// We have 4 bytes, then the start point of each
// hyperlink, then the end point of the text.
- preData = new int[1+numberOfPLCs+1];
+ int preData[] = new int[1+cntPlcs+1];
for(int i=0; i<preData.length; i++) {
preData[i] = (int)LittleEndian.getUInt(data, 8+(i*4));
}
+ setPreData(preData);
// Then we have a whole bunch of stuff, which grows
// with the number of hyperlinks
// For now, we think these are shorts
- int at = 8+4+(numberOfPLCs*4)+4;
+ int at = 8+4+(cntPlcs*4)+4;
int until = 0x34;
- if(numberOfPLCs == 1 && hyperlinks.length == 1) {
+ if(cntPlcs == 1 && hyperlinks.length == 1) {
until = oneStartsAt;
- } else if(numberOfPLCs >= 2) {
- until = twoStartsAt + (numberOfPLCs-2)*threePlusIncrement;
+ } else if(cntPlcs >= 2) {
+ until = twoStartsAt + (cntPlcs-2)*threePlusIncrement;
}
- plcValA = new long[(until-at)/2];
- plcValB = new long[0];
+ long plcValA[] = new long[(until-at)/2];
+ long plcValB[] = new long[0];
for(int i=0; i<plcValA.length; i++) {
plcValA[i] = LittleEndian.getUShort(data, at+(i*2));
}
+ setPlcValA(plcValA);
+ setPlcValB(plcValB);
// Finally, we have a series of lengths + hyperlinks
at = until;
@@ -259,7 +290,7 @@ public abstract class QCPLCBit extends QCBit {
* @param number The hyperlink number, zero based
*/
public int getTextStartAt(int number) {
- return preData[1+number];
+ return getPreData()[1+number];
}
/**
* Returns where in the text that this block
@@ -269,7 +300,7 @@ public abstract class QCPLCBit extends QCBit {
* PLCBit applies to.
*/
public int getAllTextEndAt() {
- return preData[numberOfPLCs+1];
+ return getPreData()[getNumberOfPLCs()+1];
}
}
}
diff --git a/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCTextBit.java b/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCTextBit.java
index 9d8c42493c..41cd89014a 100644
--- a/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCTextBit.java
+++ b/src/scratchpad/src/org/apache/poi/hpbf/model/qcbits/QCTextBit.java
@@ -32,13 +32,12 @@ public final class QCTextBit extends QCBit {
* are \r and not \n
*/
public String getText() {
- return StringUtil.getFromUnicodeLE(
- data, 0, data.length/2
- );
+ return StringUtil.getFromUnicodeLE(getData());
}
public void setText(String text) {
- data = new byte[text.length()*2];
+ byte data[] = new byte[text.length()*2];
StringUtil.putUnicodeLE(text, data, 0);
+ setData(data);
}
}
diff --git a/src/scratchpad/testcases/org/apache/poi/hdgf/streams/StreamTest.java b/src/scratchpad/testcases/org/apache/poi/hdgf/streams/StreamTest.java
index b79eda3554..f29adb7f0c 100644
--- a/src/scratchpad/testcases/org/apache/poi/hdgf/streams/StreamTest.java
+++ b/src/scratchpad/testcases/org/apache/poi/hdgf/streams/StreamTest.java
@@ -28,10 +28,10 @@ public abstract class StreamTest extends TestCase {
protected boolean hasPointers = false;
public TestPointer(boolean compressed, int offset, int length, int type, short format) {
this.compressed = compressed;
- this.offset = offset;
- this.length = length;
- this.type = type;
- this.format = format;
+ setOffset(offset);
+ setLength(length);
+ setType(type);
+ setFormat(format);
}
@Override