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

SSTSerializer

public class SSTSerializer extends Object
This class handles serialization of SST records. It utilizes the record processor class write individual records. This has been refactored from the SSTRecord class.
author
Glen Stampoultzis (glens at apache.org)

Fields Summary
private IntMapper
strings
private SSTRecordHeader
sstRecordHeader
int[]
bucketAbsoluteOffsets
Offsets from the beginning of the SST record (even across continuations)
int[]
bucketRelativeOffsets
Offsets relative the start of the current SST or continue record
int
startOfSST
int
startOfRecord
Constructors Summary
public SSTSerializer(IntMapper strings, int numStrings, int numUniqueStrings)

        this.strings = strings;
        this.sstRecordHeader = new SSTRecordHeader( numStrings, numUniqueStrings );

        int infoRecs = ExtSSTRecord.getNumberOfInfoRecsForStrings(strings.size());
        this.bucketAbsoluteOffsets = new int[infoRecs];
        this.bucketRelativeOffsets = new int[infoRecs];
    
Methods Summary
public int[]getBucketAbsoluteOffsets()

        return bucketAbsoluteOffsets;
    
public int[]getBucketRelativeOffsets()

        return bucketRelativeOffsets;
    
private org.apache.poi.hssf.record.UnicodeStringgetUnicodeString(int index)

        return getUnicodeString(strings, index);
    
private static org.apache.poi.hssf.record.UnicodeStringgetUnicodeString(org.apache.poi.util.IntMapper strings, int index)

        return ( (UnicodeString) strings.get( index ) );
    
public intserialize(int offset, byte[] data)
Create a byte array consisting of an SST record and any required Continue records, ready to be written out.

If an SST record and any subsequent Continue records are read in to create this instance, this method should produce a byte array that is identical to the byte array produced by concatenating the input records' data.

return
the byte array

      UnicodeString.UnicodeRecordStats stats = new UnicodeString.UnicodeRecordStats();
      sstRecordHeader.writeSSTHeader( stats, data, 0 + offset, 0 );
      int pos = offset + SSTRecord.SST_RECORD_OVERHEAD;

        for ( int k = 0; k < strings.size(); k++ )
        {
            if (k % ExtSSTRecord.DEFAULT_BUCKET_SIZE == 0)
            {
              int index = k/ExtSSTRecord.DEFAULT_BUCKET_SIZE;
              if (index < ExtSSTRecord.MAX_BUCKETS) {
                //Excel only indexes the first 128 buckets.
              bucketAbsoluteOffsets[index] = pos-offset;
              bucketRelativeOffsets[index] = pos-offset;
              }
            }
          UnicodeString s = getUnicodeString(k);
          pos += s.serialize(stats, pos, data);
            }
      //Check to see if there is a hanging continue record length
      if (stats.lastLengthPos != -1) {
        short lastRecordLength = (short)(pos - stats.lastLengthPos-2);
        if (lastRecordLength > 8224)
          throw new InternalError();

        LittleEndian.putShort(data, stats.lastLengthPos, lastRecordLength);
                  }
      return pos - offset;