FileDocCategorySizeDatePackage
DefaultEscherRecordFactory.javaAPI DocApache Poi 3.0.15719Mon Jan 01 12:39:40 GMT 2007org.apache.poi.ddf

DefaultEscherRecordFactory

public class DefaultEscherRecordFactory extends Object implements EscherRecordFactory
Generates escher records when provided the byte array containing those records.
author
Glen Stampoultzis
author
Nick Burch (nick at torchbox . com)
see
EscherRecordFactory

Fields Summary
private static Class[]
escherRecordClasses
private static Map
recordsMap
Constructors Summary
public DefaultEscherRecordFactory()
Creates an instance of the escher record factory


                 
     
    
    
Methods Summary
public org.apache.poi.ddf.EscherRecordcreateRecord(byte[] data, int offset)
Generates an escher record including the any children contained under that record. An exception is thrown if the record could not be generated.

param
data The byte array containing the records
param
offset The starting offset into the byte array
return
The generated escher record

        EscherRecord.EscherRecordHeader header = EscherRecord.EscherRecordHeader.readHeader( data, offset );

		// Options of 0x000F means container record
		// However, EscherTextboxRecord are containers of records for the
		//  host application, not of other Escher records, so treat them
		//  differently
        if ( ( header.getOptions() & (short) 0x000F ) == (short) 0x000F
             && header.getRecordId() != EscherTextboxRecord.RECORD_ID ) {
            EscherContainerRecord r = new EscherContainerRecord();
            r.setRecordId( header.getRecordId() );
            r.setOptions( header.getOptions() );
            return r;
        }
        else if ( header.getRecordId() >= EscherBlipRecord.RECORD_ID_START && header.getRecordId() <= EscherBlipRecord.RECORD_ID_END )
        {
            EscherBlipRecord r;
            if (header.getRecordId() == EscherBitmapBlip.RECORD_ID_DIB ||
                    header.getRecordId() == EscherBitmapBlip.RECORD_ID_JPEG ||
                    header.getRecordId() == EscherBitmapBlip.RECORD_ID_PNG)
            {
                r = new EscherBitmapBlip();
            }
            else
            {
                r = new EscherBlipRecord();
            }
            r.setRecordId( header.getRecordId() );
            r.setOptions( header.getOptions() );
            return r;
        }
        else
        {
            Constructor recordConstructor = (Constructor) recordsMap.get( new Short( header.getRecordId() ) );
            EscherRecord escherRecord = null;
            if ( recordConstructor != null )
            {
                try
                {
                    escherRecord = (EscherRecord) recordConstructor.newInstance( new Object[]{} );
                    escherRecord.setRecordId( header.getRecordId() );
                    escherRecord.setOptions( header.getOptions() );
                }
                catch ( Exception e )
                {
                    escherRecord = null;
                }
            }
            return escherRecord == null ? new UnknownEscherRecord() : escherRecord;
        }
    
private static java.util.MaprecordsToMap(java.lang.Class[] records)
Converts from a list of classes into a map that contains the record id as the key and the Constructor in the value part of the map. It does this by using reflection to look up the RECORD_ID field then using reflection again to find a reference to the constructor.

param
records The records to convert
return
The map containing the id/constructor pairs.

        Map result = new HashMap();
        Constructor constructor;

        for ( int i = 0; i < records.length; i++ )
        {
            Class record = null;
            short sid = 0;

            record = records[i];
            try
            {
                sid = record.getField( "RECORD_ID" ).getShort( null );
                constructor = record.getConstructor( new Class[]
                {
                } );
            }
            catch ( Exception illegalArgumentException )
            {
                throw new RecordFormatException(
                        "Unable to determine record types" );
            }
            result.put( new Short( sid ), constructor );
        }
        return result;