FileDocCategorySizeDatePackage
ExtSSTRecord.javaAPI DocApache Poi 3.0.16425Mon Jan 01 12:39:40 GMT 2007org.apache.poi.hssf.record

ExtSSTRecord

public class ExtSSTRecord extends Record
Title: Extended Static String Table

Description: This record is used for a quick lookup into the SST record. This record breaks the SST table into a set of buckets. The offsets to these buckets within the SST record are kept as well as the position relative to the start of the SST record. REFERENCE: PG 313 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)

author
Andrew C. Oliver (acoliver at apache dot org)
author
Jason Height (jheight at apache dot org)
version
2.0-pre
see
org.apache.poi.hssf.record.ExtSSTInfoSubRecord

Fields Summary
public static final int
DEFAULT_BUCKET_SIZE
public static final int
MAX_BUCKETS
public static final short
sid
private short
field_1_strings_per_bucket
private ArrayList
field_2_sst_info
Constructors Summary
public ExtSSTRecord()



     
    
        field_2_sst_info = new ArrayList();
    
public ExtSSTRecord(RecordInputStream in)
Constructs a EOFRecord record and sets its fields appropriately.

param
id id must be 0xff or an exception will be throw upon validation
param
size the size of the data area of the record
param
data data of the record (should not contain sid/len)

        super(in);
    
Methods Summary
public voidaddInfoRecord(ExtSSTInfoSubRecord rec)

        field_2_sst_info.add(rec);
    
protected voidfillFields(org.apache.poi.hssf.record.RecordInputStream in)

        field_2_sst_info           = new ArrayList();
        field_1_strings_per_bucket = in.readShort();
        while (in.remaining() > 0) {
            ExtSSTInfoSubRecord rec = new ExtSSTInfoSubRecord(in);

            field_2_sst_info.add(rec);
        }
    
public ExtSSTInfoSubRecordgetInfoRecordAt(int elem)

        return ( ExtSSTInfoSubRecord ) field_2_sst_info.get(elem);
    
public intgetNumInfoRecords()

        return field_2_sst_info.size();
    
public shortgetNumStringsPerBucket()

        return field_1_strings_per_bucket;
    
public static final intgetNumberOfInfoRecsForStrings(int numStrings)

      int infoRecs = (numStrings / DEFAULT_BUCKET_SIZE);
      if ((numStrings % DEFAULT_BUCKET_SIZE) != 0)
        infoRecs ++;
      //Excel seems to max out after 128 info records.
      //This isnt really documented anywhere...
      if (infoRecs > MAX_BUCKETS)
        infoRecs = MAX_BUCKETS;
      return infoRecs;
    
public intgetRecordSize()
Returns the size of this record

        return 6 + 8*getNumInfoRecords();
    
public static final intgetRecordSizeForStrings(int numStrings)
Given a number of strings (in the sst), returns the size of the extsst record

      return 4 + 2 + (getNumberOfInfoRecsForStrings(numStrings) * 8);
    
public shortgetSid()

        return sid;
    
public intserialize(int offset, byte[] data)

        LittleEndian.putShort(data, 0 + offset, sid);
        LittleEndian.putShort(data, 2 + offset, (short)(getRecordSize() - 4));
        LittleEndian.putShort(data, 4 + offset, field_1_strings_per_bucket);
        int pos = 6;

        for (int k = 0; k < getNumInfoRecords(); k++)
        {
            ExtSSTInfoSubRecord rec = getInfoRecordAt(k);
            pos += rec.serialize(pos + offset, data);
        }
        return pos;
    
public voidsetBucketOffsets(int[] bucketAbsoluteOffsets, int[] bucketRelativeOffsets)

        this.field_2_sst_info = new ArrayList(bucketAbsoluteOffsets.length);
        for ( int i = 0; i < bucketAbsoluteOffsets.length; i++ )
        {
            ExtSSTInfoSubRecord r = new ExtSSTInfoSubRecord();
            r.setBucketRecordOffset((short)bucketRelativeOffsets[i]);
            r.setStreamPos(bucketAbsoluteOffsets[i]);
            field_2_sst_info.add(r);
        }
    
public voidsetNumStringsPerBucket(short numStrings)

        field_1_strings_per_bucket = numStrings;
    
public java.lang.StringtoString()

        StringBuffer buffer = new StringBuffer();

        buffer.append("[EXTSST]\n");
        buffer.append("    .dsst           = ")
            .append(Integer.toHexString(getNumStringsPerBucket()))
            .append("\n");
        buffer.append("    .numInfoRecords = ").append(getNumInfoRecords())
            .append("\n");
        for (int k = 0; k < getNumInfoRecords(); k++)
        {
            buffer.append("    .inforecord     = ").append(k).append("\n");
            buffer.append("    .streampos      = ")
                .append(Integer
                .toHexString(getInfoRecordAt(k).getStreamPos())).append("\n");
            buffer.append("    .sstoffset      = ")
                .append(Integer
                .toHexString(getInfoRecordAt(k).getBucketSSTOffset()))
                    .append("\n");
        }
        buffer.append("[/EXTSST]\n");
        return buffer.toString();
    
protected voidvalidateSid(short id)

        if (id != sid)
        {
            throw new RecordFormatException("NOT An EXTSST RECORD");
        }