Removed dodgy superlcass implementation of Record.getRecordSize()

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@709263 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Josh Micich 2008-10-30 22:07:26 +00:00
parent bbfd402f8a
commit 0fff7ab2d2
10 changed files with 86 additions and 154 deletions

View File

@ -18,12 +18,13 @@
package org.apache.poi.hssf.eventusermodel.dummyrecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RecordFormatException;
/**
* A dummy record to indicate that we've now had the last
* cell record for this row.
*/
public class LastCellOfRowDummyRecord extends Record {
public final class LastCellOfRowDummyRecord extends Record {
private int row;
private int lastColumnNumber;
@ -50,6 +51,9 @@ public class LastCellOfRowDummyRecord extends Record {
return -1;
}
public int serialize(int offset, byte[] data) {
return -1;
throw new RecordFormatException("Cannot serialize a dummy record");
}
public int getRecordSize() {
throw new RecordFormatException("Cannot serialize a dummy record");
}
}

View File

@ -18,12 +18,13 @@
package org.apache.poi.hssf.eventusermodel.dummyrecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RecordFormatException;
/**
* A dummy record for when we're missing a cell in a row,
* but still want to trigger something
*/
public class MissingCellDummyRecord extends Record {
public final class MissingCellDummyRecord extends Record {
private int row;
private int column;
@ -36,7 +37,10 @@ public class MissingCellDummyRecord extends Record {
return -1;
}
public int serialize(int offset, byte[] data) {
return -1;
throw new RecordFormatException("Cannot serialize a dummy record");
}
public int getRecordSize() {
throw new RecordFormatException("Cannot serialize a dummy record");
}
public int getRow() { return row; }

View File

@ -18,13 +18,13 @@
package org.apache.poi.hssf.eventusermodel.dummyrecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.record.RecordFormatException;
/**
* A dummy record for when we're missing a row, but still
* want to trigger something
*/
public class MissingRowDummyRecord extends Record {
public final class MissingRowDummyRecord extends Record {
private int rowNumber;
public MissingRowDummyRecord(int rowNumber) {
@ -35,7 +35,10 @@ public class MissingRowDummyRecord extends Record {
return -1;
}
public int serialize(int offset, byte[] data) {
return -1;
throw new RecordFormatException("Cannot serialize a dummy record");
}
public int getRecordSize() {
throw new RecordFormatException("Cannot serialize a dummy record");
}
public int getRowNumber() {

View File

@ -1,4 +1,3 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@ -15,7 +14,6 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.hssf.record;
@ -31,20 +29,14 @@ import org.apache.poi.util.LittleEndian;
*/
public final class ContinueRecord extends Record {
public final static short sid = 0x003C;
private byte[] _data;
private byte[] _data;
public ContinueRecord(byte[] data) {
_data = data;
}
/**
* USE ONLY within "processContinue"
*/
public byte [] serialize()
{
byte[] retval = new byte[ _data.length + 4 ];
serialize(0, retval);
return retval;
public int getRecordSize() {
return 4 + _data.length;
}
public int serialize(int offset, byte[] data) {

View File

@ -114,10 +114,11 @@ public final class LabelRecord extends Record implements CellValueRecordInterfac
/**
* THROWS A RUNTIME EXCEPTION.. USE LABELSSTRecords. YOU HAVE NO REASON to use LABELRecord!!
*/
public int serialize(int offset, byte [] data)
{
throw new RecordFormatException(
"Label Records are supported READ ONLY...convert to LabelSST");
public int serialize(int offset, byte [] data) {
throw new RecordFormatException("Label Records are supported READ ONLY...convert to LabelSST");
}
public int getRecordSize() {
throw new RecordFormatException("Label Records are supported READ ONLY...convert to LabelSST");
}
public short getSid()

View File

@ -1,4 +1,3 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@ -15,50 +14,33 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
/*
* MulBlankRecord.java
*
* Created on December 10, 2001, 12:49 PM
*/
package org.apache.poi.hssf.record;
/**
* Title: Mulitple Blank cell record <P>
* Title: Multiple Blank cell record(0x00BE) <P/>
* Description: Represents a set of columns in a row with no value but with styling.
* In this release we have read-only support for this record type.
* The RecordFactory converts this to a set of BlankRecord objects.<P>
* REFERENCE: PG 329 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P>
* The RecordFactory converts this to a set of BlankRecord objects.<P/>
* REFERENCE: PG 329 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P/>
* @author Andrew C. Oliver (acoliver at apache dot org)
* @author Glen Stampoultzis (glens at apache.org)
* @version 2.0-pre
* @see org.apache.poi.hssf.record.BlankRecord
* @see BlankRecord
*/
public class MulBlankRecord
extends Record
{
public final static short sid = 0xbe;
//private short field_1_row;
private int field_1_row;
public final class MulBlankRecord extends Record {
public final static short sid = 0x00BE;
private int field_1_row;
private short field_2_first_col;
private short[] field_3_xfs;
private short field_4_last_col;
/** Creates new MulBlankRecord */
public MulBlankRecord()
{
}
/**
* get the row number of the cells this represents
*
* @return row number
*/
//public short getRow()
public int getRow()
{
return field_1_row;
@ -68,7 +50,6 @@ public class MulBlankRecord
* starting column (first cell this holds in the row)
* @return first column number
*/
public short getFirstColumn()
{
return field_2_first_col;
@ -78,7 +59,6 @@ public class MulBlankRecord
* ending column (last cell this holds in the row)
* @return first column number
*/
public short getLastColumn()
{
return field_4_last_col;
@ -88,7 +68,6 @@ public class MulBlankRecord
* get the number of columns this contains (last-first +1)
* @return number of columns (last - first +1)
*/
public int getNumColumns()
{
return field_4_last_col - field_2_first_col + 1;
@ -99,7 +78,6 @@ public class MulBlankRecord
* @param coffset the column (coffset = column - field_2_first_col)
* @return the XF index for the column
*/
public short getXFAt(int coffset)
{
return field_3_xfs[ coffset ];
@ -108,16 +86,14 @@ public class MulBlankRecord
/**
* @param in the RecordInputstream to read the record from
*/
public MulBlankRecord(RecordInputStream in)
{
//field_1_row = LittleEndian.getShort(data, 0 + offset);
public MulBlankRecord(RecordInputStream in) {
field_1_row = in.readUShort();
field_2_first_col = in.readShort();
field_3_xfs = parseXFs(in);
field_4_last_col = in.readShort();
}
private short [] parseXFs(RecordInputStream in)
private static short [] parseXFs(RecordInputStream in)
{
short[] retval = new short[ (in.remaining() - 2) / 2 ];
@ -128,21 +104,16 @@ public class MulBlankRecord
return retval;
}
public String toString()
{
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("[MULBLANK]\n");
buffer.append("row = ")
.append(Integer.toHexString(getRow())).append("\n");
buffer.append("firstcol = ")
.append(Integer.toHexString(getFirstColumn())).append("\n");
buffer.append(" lastcol = ")
.append(Integer.toHexString(getLastColumn())).append("\n");
for (int k = 0; k < getNumColumns(); k++)
{
buffer.append("xf").append(k).append(" = ")
.append(Integer.toHexString(getXFAt(k))).append("\n");
buffer.append("row = ").append(Integer.toHexString(getRow())).append("\n");
buffer.append("firstcol = ").append(Integer.toHexString(getFirstColumn())).append("\n");
buffer.append(" lastcol = ").append(Integer.toHexString(getLastColumn())).append("\n");
for (int k = 0; k < getNumColumns(); k++) {
buffer.append("xf").append(k).append(" = ").append(
Integer.toHexString(getXFAt(k))).append("\n");
}
buffer.append("[/MULBLANK]\n");
return buffer.toString();
@ -153,9 +124,10 @@ public class MulBlankRecord
return sid;
}
public int serialize(int offset, byte [] data)
{
throw new RecordFormatException(
"Sorry, you can't serialize a MulBlank in this release");
public int serialize(int offset, byte [] data) {
throw new RecordFormatException( "Sorry, you can't serialize MulBlank in this release");
}
public int getRecordSize() {
throw new RecordFormatException( "Sorry, you can't serialize MulBlank in this release");
}
}

View File

@ -113,10 +113,11 @@ public final class MulRKRecord extends Record {
return sid;
}
public int serialize(int offset, byte [] data)
{
throw new RecordFormatException(
"Sorry, you can't serialize a MulRK in this release");
public int serialize(int offset, byte [] data) {
throw new RecordFormatException( "Sorry, you can't serialize MulRK in this release");
}
public int getRecordSize() {
throw new RecordFormatException( "Sorry, you can't serialize MulRK in this release");
}
private static final class RkRec {

View File

@ -134,48 +134,12 @@ public final class RKRecord extends Record implements CellValueRecordInterface {
return sb.toString();
}
// temporarily just constructs a new number record and returns its value
public int serialize(int offset, byte [] data)
{
NumberRecord rec = new NumberRecord();
rec.setColumn(getColumn());
rec.setRow(getRow());
rec.setValue(getRKNumber());
rec.setXFIndex(getXFIndex());
return rec.serialize(offset, data);
}
/**
* Debugging main()
* <P>
* Normally I'd do this in a junit test, but let's face it -- once
* this algorithm has been tested and it works, we are never ever
* going to change it. This is driven by the Faceless Enemy's
* minions, who dare not change the algorithm out from under us.
*
* @param ignored_args command line arguments, which we blithely
* ignore
*/
public static void main(String ignored_args[])
{
int[] values =
{
0x3FF00000, 0x405EC001, 0x02F1853A, 0x02F1853B, 0xFCDD699A
};
double[] rvalues =
{
1, 1.23, 12345678, 123456.78, -13149594
};
for (int j = 0; j < values.length; j++)
{
System.out.println("input = " + Integer.toHexString(values[ j ])
+ " -> " + rvalues[ j ] + ": "
+ RKUtil.decodeNumber(values[ j ]));
}
}
public int serialize(int offset, byte [] data) {
throw new RecordFormatException( "Sorry, you can't serialize RK in this release");
}
public int getRecordSize() {
throw new RecordFormatException( "Sorry, you can't serialize RK in this release");
}
public short getSid()
{

View File

@ -28,7 +28,6 @@ import java.io.ByteArrayInputStream;
* @author Andrew C. Oliver
* @author Marc Johnson (mjohnson at apache dot org)
* @author Jason Height (jheight at chariot dot net dot au)
* @version 2.0-pre
*/
public abstract class Record extends RecordBase {
@ -48,27 +47,13 @@ public abstract class Record extends RecordBase {
* @return byte array containing instance data
*/
public byte [] serialize()
{
public final byte[] serialize() {
byte[] retval = new byte[ getRecordSize() ];
serialize(0, retval);
return retval;
}
/**
* gives the current serialized size of the record. Should include the sid and reclength (4 bytes).
*/
public int getRecordSize()
{
// this is kind od a stupid way to do it but for now we just serialize
// the record and return the size of the byte array
return serialize().length;
}
/**
* get a string representation of the record (for biffview/debugging)
*/

View File

@ -1,4 +1,3 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@ -15,31 +14,38 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.hssf.util;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
/**
* Tests the RKUtil class.
* Tests the {@link RKUtil} class.
*/
public class TestRKUtil
extends TestCase
{
public TestRKUtil(String s)
{
super(s);
}
public final class TestRKUtil extends TestCase {
/**
* Check we can decode correctly.
*/
public void testDecode()
throws Exception
{
assertEquals(3.0, RKUtil.decodeNumber(1074266112), 0.0000001);
assertEquals(3.3, RKUtil.decodeNumber(1081384961), 0.0000001);
assertEquals(3.33, RKUtil.decodeNumber(1081397249), 0.0000001);
}
/**
* Check we can decode correctly.
*/
public void testDecode() {
int[] values = { 1074266112, 1081384961, 1081397249,
0x3FF00000, 0x405EC001, 0x02F1853A, 0x02F1853B, 0xFCDD699A,
};
double[] rvalues = { 3.0, 3.3, 3.33,
1, 1.23, 12345678, 123456.78, -13149594,
};
for (int j = 0; j < values.length; j++) {
int intBits = values[j];
double expectedValue = rvalues[j];
double actualValue = RKUtil.decodeNumber(intBits);
if (expectedValue != actualValue) {
throw new AssertionFailedError("0x" + Integer.toHexString(intBits)
+ " should decode to " + expectedValue + " but got " + actualValue);
}
}
}
}