#64036 - Replace reflection calls in factories for Java 9+ (HSSF Record Factory)

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1876467 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2020-04-13 21:55:05 +00:00
parent 4fd05fac12
commit f9417a92b2
4 changed files with 239 additions and 564 deletions

View File

@ -19,8 +19,10 @@
package org.apache.poi.hssf.record;
import java.util.HashMap;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.apache.poi.hssf.record.chart.*;
import org.apache.poi.hssf.record.pivottable.DataItemRecord;
@ -32,176 +34,176 @@ import org.apache.poi.hssf.record.pivottable.ViewFieldsRecord;
import org.apache.poi.hssf.record.pivottable.ViewSourceRecord;
public enum HSSFRecordTypes {
UNKNOWN(-1, UnknownRecord::new),
FORMULA(0x0006, FormulaRecord::new),
EOF(0x000A, EOFRecord::new),
CALC_COUNT(0x000C, CalcCountRecord::new),
CALC_MODE(0x000D, CalcModeRecord::new),
PRECISION(0x000E, PrecisionRecord::new),
REF_MODE(0x000F, RefModeRecord::new),
DELTA(0x0010, DeltaRecord::new),
ITERATION(0x0011, IterationRecord::new),
PROTECT(0x0012, ProtectRecord::new),
PASSWORD(0x0013, PasswordRecord::new),
HEADER(0x0014, HeaderRecord::new),
FOOTER(0x0015, FooterRecord::new),
EXTERN_SHEET(0x0017, ExternSheetRecord::new),
NAME(0x0018, NameRecord::new),
WINDOW_PROTECT(0x0019, WindowProtectRecord::new),
VERTICAL_PAGE_BREAK(0x001A, VerticalPageBreakRecord::new),
HORIZONTAL_PAGE_BREAK(0x001B, HorizontalPageBreakRecord::new),
NOTE(0x001C, NoteRecord::new),
SELECTION(0x001D, SelectionRecord::new),
DATE_WINDOW_1904(0x0022, DateWindow1904Record::new),
EXTERNAL_NAME(0x0023, ExternalNameRecord::new),
LEFT_MARGIN(0x0026, LeftMarginRecord::new),
RIGHT_MARGIN(0x0027, RightMarginRecord::new),
TOP_MARGIN(0x0028, TopMarginRecord::new),
BOTTOM_MARGIN(0x0029, BottomMarginRecord::new),
PRINT_HEADERS(0x002A, PrintHeadersRecord::new),
PRINT_GRIDLINES(0X002B, PrintGridlinesRecord::new),
FILE_PASS(0x002F, FilePassRecord::new),
FONT(0x0031, FontRecord::new),
CONTINUE(0x003C, ContinueRecord::new),
WINDOW_ONE(0x003D, WindowOneRecord::new),
BACKUP(0x0040, BackupRecord::new),
PANE(0x0041, PaneRecord::new),
CODEPAGE(0x0042, CodepageRecord::new),
DCON_REF(0x0051, DConRefRecord::new),
DEFAULT_COL_WIDTH(0x0055, DefaultColWidthRecord::new),
CRN_COUNT(0x0059, CRNCountRecord::new),
CRN(0x005A, CRNRecord::new),
WRITE_ACCESS(0x005C, WriteAccessRecord::new),
FILE_SHARING(0x005B, FileSharingRecord::new),
OBJ(0x005D, ObjRecord::new),
UNCALCED(0x005E, UncalcedRecord::new),
SAVE_RECALC(0x005F, SaveRecalcRecord::new),
OBJECT_PROTECT(0x0063, ObjectProtectRecord::new),
COLUMN_INFO(0x007D, ColumnInfoRecord::new),
GUTS(0x0080, GutsRecord::new),
WS_BOOL(0x0081, WSBoolRecord::new),
GRIDSET(0x0082, GridsetRecord::new),
H_CENTER(0x0083, HCenterRecord::new),
V_CENTER(0x0084, VCenterRecord::new),
BOUND_SHEET(0x0085, BoundSheetRecord::new),
WRITE_PROTECT(0x0086, WriteProtectRecord::new),
COUNTRY(0X008C, CountryRecord::new),
HIDE_OBJ(0x008D, HideObjRecord::new),
PALETTE(0x0092, PaletteRecord::new),
FN_GROUP_COUNT(0x009c, FnGroupCountRecord::new),
AUTO_FILTER_INFO(0x009D, AutoFilterInfoRecord::new),
SCL(0x00A0, SCLRecord::new),
PRINT_SETUP(0x00A1, PrintSetupRecord::new),
VIEW_DEFINITION(0x00B0, ViewDefinitionRecord::new),
VIEW_FIELDS(0x00B1, ViewFieldsRecord::new),
PAGE_ITEM(0x00B6, PageItemRecord::new),
MUL_BLANK(0x00BE, MulBlankRecord::new),
MUL_RK(0x00BD, MulRKRecord::new),
MMS(0x00C1, MMSRecord::new),
DATA_ITEM(0x00C5, DataItemRecord::new),
STREAM_ID(0x00D5, StreamIDRecord::new),
DB_CELL(0x00D7, DBCellRecord::new),
BOOK_BOOL(0x00DA, BookBoolRecord::new),
SCENARIO_PROTECT(0x00DD, ScenarioProtectRecord::new),
EXTENDED_FORMAT(0x00E0, ExtendedFormatRecord::new),
INTERFACE_HDR(0x00E1, InterfaceHdrRecord::new),
INTERFACE_END(0x00E2, InterfaceEndRecord::create),
VIEW_SOURCE(0x00E3, ViewSourceRecord::new),
MERGE_CELLS(0x00E5, MergeCellsRecord::new),
DRAWING_GROUP(0x00EB, DrawingGroupRecord::new),
DRAWING(0x00EC, DrawingRecord::new),
DRAWING_SELECTION(0x00ED, DrawingSelectionRecord::new),
SST(0x00FC, SSTRecord::new),
LABEL_SST(0X00FD, LabelSSTRecord::new),
EXT_SST(0x00FF, ExtSSTRecord::new),
EXTENDED_PIVOT_TABLE_VIEW_FIELDS(0x0100, ExtendedPivotTableViewFieldsRecord::new),
TAB_ID(0x013D, TabIdRecord::new),
USE_SEL_FS(0x0160, UseSelFSRecord::new),
DSF(0x0161, DSFRecord::new),
USER_SVIEW_BEGIN(0x01AA, UserSViewBegin::new),
USER_SVIEW_END(0x01AB, UserSViewEnd::new),
SUP_BOOK(0x01AE, SupBookRecord::new),
PROTECTION_REV_4(0x01AF, ProtectionRev4Record::new),
CF_HEADER(0x01B0, CFHeaderRecord::new),
CF_RULE(0x01B1, CFRuleRecord::new),
DVAL(0x01B2, DVALRecord::new),
TEXT_OBJECT(0x01B6, TextObjectRecord::new),
REFRESH_ALL(0x01B7, RefreshAllRecord::new),
HYPERLINK(0x01B8, HyperlinkRecord::new),
PASSWORD_REV_4(0x01BC, PasswordRev4Record::new),
DV(0x01BE, DVRecord::new),
RECALC_ID(0x01C1, RecalcIdRecord::new),
DIMENSIONS(0x0200, DimensionsRecord::new),
BLANK(0x0201, BlankRecord::new),
NUMBER(0x0203, NumberRecord::new),
LABEL(0x0204, LabelRecord::new),
BOOL_ERR(0x0205, BoolErrRecord::new),
STRING(0x0207, StringRecord::new),
ROW(0x0208, RowRecord::new),
INDEX(0x020B, IndexRecord::new),
ARRAY(0x0221, ArrayRecord::new),
DEFAULT_ROW_HEIGHT(0x0225, DefaultRowHeightRecord::new),
TABLE(0x0236, TableRecord::new),
WINDOW_TWO(0x023E, WindowTwoRecord::new),
RK(0x027E, RKRecord::new),
STYLE(0x0293, StyleRecord::new),
FORMAT(0x041E, FormatRecord::new),
SHARED_FORMULA(0x04BC, SharedFormulaRecord::new),
BOF(0x0809, BOFRecord::new),
CHART_FRT_INFO(0x0850, ChartFRTInfoRecord::new),
CHART_START_BLOCK(0x0852, ChartStartBlockRecord::new),
CHART_END_BLOCK(0x0853, ChartEndBlockRecord::new),
CHART_START_OBJECT(0x0854, ChartStartObjectRecord::new),
CHART_END_OBJECT(0x0855, ChartEndObjectRecord::new),
CAT_LAB(0x0856, CatLabRecord::new),
FEAT_HDR(0x0867, FeatHdrRecord::new),
FEAT(0x0868, FeatRecord::new),
DATA_LABEL_EXTENSION(0x086A, DataLabelExtensionRecord::new),
CF_HEADER_12(0x0879, CFHeader12Record::new),
CF_RULE_12(0x087A, CFRule12Record::new),
TABLE_STYLES(0x088E, TableStylesRecord::new),
NAME_COMMENT(0x0894, NameCommentRecord::new),
HEADER_FOOTER(0x089C, HeaderFooterRecord::new),
UNITS(0x1001, UnitsRecord::new),
CHART(0x1002, ChartRecord::new),
SERIES(0x1003, SeriesRecord::new),
DATA_FORMAT(0x1006, DataFormatRecord::new),
LINE_FORMAT(0x1007, LineFormatRecord::new),
AREA_FORMAT(0x100A, AreaFormatRecord::new),
SERIES_LABELS(0x100C, SeriesLabelsRecord::new),
SERIES_TEXT(0x100D, SeriesTextRecord::new),
CHART_FORMAT(0x1014, ChartFormatRecord::new),
LEGEND(0x1015, LegendRecord::new),
SERIES_LIST(0x1016, SeriesListRecord::new),
BAR(0x1017, BarRecord::new),
AREA(0x101A, AreaRecord::new),
AXIS(0x101D, AxisRecord::new),
TICK(0x101E, TickRecord::new),
VALUE_RANGE(0x101F, ValueRangeRecord::new),
CATEGORY_SERIES_AXIS(0x1020, CategorySeriesAxisRecord::new),
AXIS_LINE_FORMAT(0x1021, AxisLineFormatRecord::new),
DEFAULT_DATA_LABEL_TEXT_PROPERTIES(0x1024, DefaultDataLabelTextPropertiesRecord::new),
TEXT(0x1025, TextRecord::new),
FONT_INDEX(0x1026, FontIndexRecord::new),
OBJECT_LINK(0x1027, ObjectLinkRecord::new),
FRAME(0x1032, FrameRecord::new),
BEGIN(0x1033, BeginRecord::new),
END(0x1034, EndRecord::new),
PLOT_AREA(0x1035, PlotAreaRecord::new),
AXIS_PARENT(0x1041, AxisParentRecord::new),
SHEET_PROPERTIES(0x1044, SheetPropertiesRecord::new),
SERIES_CHART_GROUP_INDEX(0x1045, SeriesChartGroupIndexRecord::new),
AXIS_USED(0x1046, AxisUsedRecord::new),
NUMBER_FORMAT_INDEX(0x104E, NumberFormatIndexRecord::new),
CHART_TITLE_FORMAT(0x1050, ChartTitleFormatRecord::new),
LINKED_DATA(0x1051, LinkedDataRecord::new),
FONT_BASIS(0x1060, FontBasisRecord::new),
AXIS_OPTIONS(0x1062, AxisOptionsRecord::new),
DAT(0x1063, DatRecord::new),
PLOT_GROWTH(0x1064, PlotGrowthRecord::new),
SERIES_INDEX(0x1065, SeriesIndexRecord::new),
UNKNOWN(-1, UnknownRecord.class, UnknownRecord::new, false),
FORMULA(0x0006, FormulaRecord.class, FormulaRecord::new),
EOF(0x000A, EOFRecord.class, EOFRecord::new),
CALC_COUNT(0x000C, CalcCountRecord.class, CalcCountRecord::new),
CALC_MODE(0x000D, CalcModeRecord.class, CalcModeRecord::new),
PRECISION(0x000E, PrecisionRecord.class, PrecisionRecord::new),
REF_MODE(0x000F, RefModeRecord.class, RefModeRecord::new),
DELTA(0x0010, DeltaRecord.class, DeltaRecord::new),
ITERATION(0x0011, IterationRecord.class, IterationRecord::new),
PROTECT(0x0012, ProtectRecord.class, ProtectRecord::new),
PASSWORD(0x0013, PasswordRecord.class, PasswordRecord::new),
HEADER(0x0014, HeaderRecord.class, HeaderRecord::new),
FOOTER(0x0015, FooterRecord.class, FooterRecord::new),
EXTERN_SHEET(0x0017, ExternSheetRecord.class, ExternSheetRecord::new),
NAME(0x0018, NameRecord.class, NameRecord::new),
WINDOW_PROTECT(0x0019, WindowProtectRecord.class, WindowProtectRecord::new),
VERTICAL_PAGE_BREAK(0x001A, VerticalPageBreakRecord.class, VerticalPageBreakRecord::new),
HORIZONTAL_PAGE_BREAK(0x001B, HorizontalPageBreakRecord.class, HorizontalPageBreakRecord::new),
NOTE(0x001C, NoteRecord.class, NoteRecord::new),
SELECTION(0x001D, SelectionRecord.class, SelectionRecord::new),
DATE_WINDOW_1904(0x0022, DateWindow1904Record.class, DateWindow1904Record::new),
EXTERNAL_NAME(0x0023, ExternalNameRecord.class, ExternalNameRecord::new),
LEFT_MARGIN(0x0026, LeftMarginRecord.class, LeftMarginRecord::new),
RIGHT_MARGIN(0x0027, RightMarginRecord.class, RightMarginRecord::new),
TOP_MARGIN(0x0028, TopMarginRecord.class, TopMarginRecord::new),
BOTTOM_MARGIN(0x0029, BottomMarginRecord.class, BottomMarginRecord::new),
PRINT_HEADERS(0x002A, PrintHeadersRecord.class, PrintHeadersRecord::new),
PRINT_GRIDLINES(0X002B, PrintGridlinesRecord.class, PrintGridlinesRecord::new),
FILE_PASS(0x002F, FilePassRecord.class, FilePassRecord::new),
FONT(0x0031, FontRecord.class, FontRecord::new),
CONTINUE(0x003C, ContinueRecord.class, ContinueRecord::new),
WINDOW_ONE(0x003D, WindowOneRecord.class, WindowOneRecord::new),
BACKUP(0x0040, BackupRecord.class, BackupRecord::new),
PANE(0x0041, PaneRecord.class, PaneRecord::new),
CODEPAGE(0x0042, CodepageRecord.class, CodepageRecord::new),
DCON_REF(0x0051, DConRefRecord.class, DConRefRecord::new),
DEFAULT_COL_WIDTH(0x0055, DefaultColWidthRecord.class, DefaultColWidthRecord::new),
CRN_COUNT(0x0059, CRNCountRecord.class, CRNCountRecord::new),
CRN(0x005A, CRNRecord.class, CRNRecord::new),
WRITE_ACCESS(0x005C, WriteAccessRecord.class, WriteAccessRecord::new),
FILE_SHARING(0x005B, FileSharingRecord.class, FileSharingRecord::new),
OBJ(0x005D, ObjRecord.class, ObjRecord::new),
UNCALCED(0x005E, UncalcedRecord.class, UncalcedRecord::new),
SAVE_RECALC(0x005F, SaveRecalcRecord.class, SaveRecalcRecord::new),
OBJECT_PROTECT(0x0063, ObjectProtectRecord.class, ObjectProtectRecord::new),
COLUMN_INFO(0x007D, ColumnInfoRecord.class, ColumnInfoRecord::new),
GUTS(0x0080, GutsRecord.class, GutsRecord::new),
WS_BOOL(0x0081, WSBoolRecord.class, WSBoolRecord::new),
GRIDSET(0x0082, GridsetRecord.class, GridsetRecord::new),
H_CENTER(0x0083, HCenterRecord.class, HCenterRecord::new),
V_CENTER(0x0084, VCenterRecord.class, VCenterRecord::new),
BOUND_SHEET(0x0085, BoundSheetRecord.class, BoundSheetRecord::new),
WRITE_PROTECT(0x0086, WriteProtectRecord.class, WriteProtectRecord::new),
COUNTRY(0X008C, CountryRecord.class, CountryRecord::new),
HIDE_OBJ(0x008D, HideObjRecord.class, HideObjRecord::new),
PALETTE(0x0092, PaletteRecord.class, PaletteRecord::new),
FN_GROUP_COUNT(0x009c, FnGroupCountRecord.class, FnGroupCountRecord::new),
AUTO_FILTER_INFO(0x009D, AutoFilterInfoRecord.class, AutoFilterInfoRecord::new),
SCL(0x00A0, SCLRecord.class, SCLRecord::new, false),
PRINT_SETUP(0x00A1, PrintSetupRecord.class, PrintSetupRecord::new),
VIEW_DEFINITION(0x00B0, ViewDefinitionRecord.class, ViewDefinitionRecord::new),
VIEW_FIELDS(0x00B1, ViewFieldsRecord.class, ViewFieldsRecord::new),
PAGE_ITEM(0x00B6, PageItemRecord.class, PageItemRecord::new),
MUL_BLANK(0x00BE, MulBlankRecord.class, MulBlankRecord::new),
MUL_RK(0x00BD, MulRKRecord.class, MulRKRecord::new),
MMS(0x00C1, MMSRecord.class, MMSRecord::new),
DATA_ITEM(0x00C5, DataItemRecord.class, DataItemRecord::new),
STREAM_ID(0x00D5, StreamIDRecord.class, StreamIDRecord::new),
DB_CELL(0x00D7, DBCellRecord.class, DBCellRecord::new),
BOOK_BOOL(0x00DA, BookBoolRecord.class, BookBoolRecord::new),
SCENARIO_PROTECT(0x00DD, ScenarioProtectRecord.class, ScenarioProtectRecord::new),
EXTENDED_FORMAT(0x00E0, ExtendedFormatRecord.class, ExtendedFormatRecord::new),
INTERFACE_HDR(0x00E1, InterfaceHdrRecord.class, InterfaceHdrRecord::new),
INTERFACE_END(0x00E2, InterfaceEndRecord.class, InterfaceEndRecord::create),
VIEW_SOURCE(0x00E3, ViewSourceRecord.class, ViewSourceRecord::new),
MERGE_CELLS(0x00E5, MergeCellsRecord.class, MergeCellsRecord::new),
DRAWING_GROUP(0x00EB, DrawingGroupRecord.class, DrawingGroupRecord::new),
DRAWING(0x00EC, DrawingRecord.class, DrawingRecord::new),
DRAWING_SELECTION(0x00ED, DrawingSelectionRecord.class, DrawingSelectionRecord::new),
SST(0x00FC, SSTRecord.class, SSTRecord::new),
LABEL_SST(0X00FD, LabelSSTRecord.class, LabelSSTRecord::new),
EXT_SST(0x00FF, ExtSSTRecord.class, ExtSSTRecord::new),
EXTENDED_PIVOT_TABLE_VIEW_FIELDS(0x0100, ExtendedPivotTableViewFieldsRecord.class, ExtendedPivotTableViewFieldsRecord::new),
TAB_ID(0x013D, TabIdRecord.class, TabIdRecord::new),
USE_SEL_FS(0x0160, UseSelFSRecord.class, UseSelFSRecord::new),
DSF(0x0161, DSFRecord.class, DSFRecord::new),
USER_SVIEW_BEGIN(0x01AA, UserSViewBegin.class, UserSViewBegin::new),
USER_SVIEW_END(0x01AB, UserSViewEnd.class, UserSViewEnd::new),
SUP_BOOK(0x01AE, SupBookRecord.class, SupBookRecord::new),
PROTECTION_REV_4(0x01AF, ProtectionRev4Record.class, ProtectionRev4Record::new),
CF_HEADER(0x01B0, CFHeaderRecord.class, CFHeaderRecord::new),
CF_RULE(0x01B1, CFRuleRecord.class, CFRuleRecord::new),
DVAL(0x01B2, DVALRecord.class, DVALRecord::new),
TEXT_OBJECT(0x01B6, TextObjectRecord.class, TextObjectRecord::new),
REFRESH_ALL(0x01B7, RefreshAllRecord.class, RefreshAllRecord::new),
HYPERLINK(0x01B8, HyperlinkRecord.class, HyperlinkRecord::new),
PASSWORD_REV_4(0x01BC, PasswordRev4Record.class, PasswordRev4Record::new),
DV(0x01BE, DVRecord.class, DVRecord::new),
RECALC_ID(0x01C1, RecalcIdRecord.class, RecalcIdRecord::new),
DIMENSIONS(0x0200, DimensionsRecord.class, DimensionsRecord::new),
BLANK(0x0201, BlankRecord.class, BlankRecord::new),
NUMBER(0x0203, NumberRecord.class, NumberRecord::new),
LABEL(0x0204, LabelRecord.class, LabelRecord::new),
BOOL_ERR(0x0205, BoolErrRecord.class, BoolErrRecord::new),
STRING(0x0207, StringRecord.class, StringRecord::new),
ROW(0x0208, RowRecord.class, RowRecord::new),
INDEX(0x020B, IndexRecord.class, IndexRecord::new),
ARRAY(0x0221, ArrayRecord.class, ArrayRecord::new),
DEFAULT_ROW_HEIGHT(0x0225, DefaultRowHeightRecord.class, DefaultRowHeightRecord::new),
TABLE(0x0236, TableRecord.class, TableRecord::new),
WINDOW_TWO(0x023E, WindowTwoRecord.class, WindowTwoRecord::new),
RK(0x027E, RKRecord.class, RKRecord::new),
STYLE(0x0293, StyleRecord.class, StyleRecord::new),
FORMAT(0x041E, FormatRecord.class, FormatRecord::new),
SHARED_FORMULA(0x04BC, SharedFormulaRecord.class, SharedFormulaRecord::new),
BOF(0x0809, BOFRecord.class, BOFRecord::new),
CHART_FRT_INFO(0x0850, ChartFRTInfoRecord.class, ChartFRTInfoRecord::new),
CHART_START_BLOCK(0x0852, ChartStartBlockRecord.class, ChartStartBlockRecord::new),
CHART_END_BLOCK(0x0853, ChartEndBlockRecord.class, ChartEndBlockRecord::new),
CHART_START_OBJECT(0x0854, ChartStartObjectRecord.class, ChartStartObjectRecord::new),
CHART_END_OBJECT(0x0855, ChartEndObjectRecord.class, ChartEndObjectRecord::new),
CAT_LAB(0x0856, CatLabRecord.class, CatLabRecord::new),
FEAT_HDR(0x0867, FeatHdrRecord.class, FeatHdrRecord::new),
FEAT(0x0868, FeatRecord.class, FeatRecord::new),
DATA_LABEL_EXTENSION(0x086A, DataLabelExtensionRecord.class, DataLabelExtensionRecord::new, false),
CF_HEADER_12(0x0879, CFHeader12Record.class, CFHeader12Record::new),
CF_RULE_12(0x087A, CFRule12Record.class, CFRule12Record::new),
TABLE_STYLES(0x088E, TableStylesRecord.class, TableStylesRecord::new),
NAME_COMMENT(0x0894, NameCommentRecord.class, NameCommentRecord::new),
HEADER_FOOTER(0x089C, HeaderFooterRecord.class, HeaderFooterRecord::new),
UNITS(0x1001, UnitsRecord.class, UnitsRecord::new, false),
CHART(0x1002, ChartRecord.class, ChartRecord::new),
SERIES(0x1003, SeriesRecord.class, SeriesRecord::new),
DATA_FORMAT(0x1006, DataFormatRecord.class, DataFormatRecord::new),
LINE_FORMAT(0x1007, LineFormatRecord.class, LineFormatRecord::new, false),
AREA_FORMAT(0x100A, AreaFormatRecord.class, AreaFormatRecord::new, false),
SERIES_LABELS(0x100C, SeriesLabelsRecord.class, SeriesLabelsRecord::new, false),
SERIES_TEXT(0x100D, SeriesTextRecord.class, SeriesTextRecord::new),
CHART_FORMAT(0x1014, ChartFormatRecord.class, ChartFormatRecord::new, false),
LEGEND(0x1015, LegendRecord.class, LegendRecord::new),
SERIES_LIST(0x1016, SeriesListRecord.class, SeriesListRecord::new, false),
BAR(0x1017, BarRecord.class, BarRecord::new, false),
AREA(0x101A, AreaRecord.class, AreaRecord::new),
AXIS(0x101D, AxisRecord.class, AxisRecord::new, false),
TICK(0x101E, TickRecord.class, TickRecord::new, false),
VALUE_RANGE(0x101F, ValueRangeRecord.class, ValueRangeRecord::new),
CATEGORY_SERIES_AXIS(0x1020, CategorySeriesAxisRecord.class, CategorySeriesAxisRecord::new, false),
AXIS_LINE_FORMAT(0x1021, AxisLineFormatRecord.class, AxisLineFormatRecord::new, false),
DEFAULT_DATA_LABEL_TEXT_PROPERTIES(0x1024, DefaultDataLabelTextPropertiesRecord.class, DefaultDataLabelTextPropertiesRecord::new, false),
TEXT(0x1025, TextRecord.class, TextRecord::new, false),
FONT_INDEX(0x1026, FontIndexRecord.class, FontIndexRecord::new, false),
OBJECT_LINK(0x1027, ObjectLinkRecord.class, ObjectLinkRecord::new, false),
FRAME(0x1032, FrameRecord.class, FrameRecord::new, false),
BEGIN(0x1033, BeginRecord.class, BeginRecord::new),
END(0x1034, EndRecord.class, EndRecord::new),
PLOT_AREA(0x1035, PlotAreaRecord.class, PlotAreaRecord::new, false),
AXIS_PARENT(0x1041, AxisParentRecord.class, AxisParentRecord::new, false),
SHEET_PROPERTIES(0x1044, SheetPropertiesRecord.class, SheetPropertiesRecord::new, false),
SERIES_CHART_GROUP_INDEX(0x1045, SeriesChartGroupIndexRecord.class, SeriesChartGroupIndexRecord::new),
AXIS_USED(0x1046, AxisUsedRecord.class, AxisUsedRecord::new, false),
NUMBER_FORMAT_INDEX(0x104E, NumberFormatIndexRecord.class, NumberFormatIndexRecord::new, false),
CHART_TITLE_FORMAT(0x1050, ChartTitleFormatRecord.class, ChartTitleFormatRecord::new),
LINKED_DATA(0x1051, LinkedDataRecord.class, LinkedDataRecord::new),
FONT_BASIS(0x1060, FontBasisRecord.class, FontBasisRecord::new, false),
AXIS_OPTIONS(0x1062, AxisOptionsRecord.class, AxisOptionsRecord::new, false),
DAT(0x1063, DatRecord.class, DatRecord::new, false),
PLOT_GROWTH(0x1064, PlotGrowthRecord.class, PlotGrowthRecord::new, false),
SERIES_INDEX(0x1065, SeriesIndexRecord.class, SeriesIndexRecord::new, false),
// Dummy record
ESCHER_AGGREGATE(9876, (in) -> new EscherAggregate(true))
ESCHER_AGGREGATE(9876, EscherAggregate.class, (in) -> new EscherAggregate(true))
;
@FunctionalInterface
@ -209,25 +211,42 @@ public enum HSSFRecordTypes {
T apply(RecordInputStream in);
}
private static final Map<Short,HSSFRecordTypes> LOOKUP;
static {
LOOKUP = new HashMap<>();
for(HSSFRecordTypes s : values()) {
LOOKUP.put(s.sid, s);
}
}
private static final Map<Short,HSSFRecordTypes> LOOKUP =
Arrays.stream(values()).collect(Collectors.toMap(HSSFRecordTypes::getSid, Function.identity()));
public final short sid;
public final RecordConstructor<?> recordConstructor;
public final Class<? extends org.apache.poi.hssf.record.Record> clazz;
public final RecordConstructor<? extends org.apache.poi.hssf.record.Record> recordConstructor;
public final boolean parse;
HSSFRecordTypes(int sid, RecordConstructor<?> recordConstructor) {
HSSFRecordTypes(int sid, Class<? extends org.apache.poi.hssf.record.Record> clazz, RecordConstructor<? extends org.apache.poi.hssf.record.Record> recordConstructor) {
this(sid, clazz, recordConstructor,true);
}
HSSFRecordTypes(int sid, Class<? extends org.apache.poi.hssf.record.Record> clazz, RecordConstructor<? extends org.apache.poi.hssf.record.Record> recordConstructor, boolean parse) {
this.sid = (short)sid;
this.clazz = clazz;
this.recordConstructor = recordConstructor;
this.parse = parse;
}
public static HSSFRecordTypes forTypeID(int typeID) {
return LOOKUP.getOrDefault((short)typeID, UNKNOWN);
public static HSSFRecordTypes forSID(int sid) {
return LOOKUP.getOrDefault((short)sid, UNKNOWN);
}
public short getSid() {
return sid;
}
public Class<? extends Record> getClazz() {
return clazz;
}
public RecordConstructor<? extends org.apache.poi.hssf.record.Record> getRecordConstructor() {
return recordConstructor;
}
public boolean isParseable() {
return parse;
}
}

View File

@ -18,44 +18,9 @@
package org.apache.poi.hssf.record;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.hssf.record.chart.BeginRecord;
import org.apache.poi.hssf.record.chart.CatLabRecord;
import org.apache.poi.hssf.record.chart.ChartEndBlockRecord;
import org.apache.poi.hssf.record.chart.ChartEndObjectRecord;
import org.apache.poi.hssf.record.chart.ChartFRTInfoRecord;
import org.apache.poi.hssf.record.chart.ChartRecord;
import org.apache.poi.hssf.record.chart.ChartStartBlockRecord;
import org.apache.poi.hssf.record.chart.ChartStartObjectRecord;
import org.apache.poi.hssf.record.chart.ChartTitleFormatRecord;
import org.apache.poi.hssf.record.chart.DataFormatRecord;
import org.apache.poi.hssf.record.chart.EndRecord;
import org.apache.poi.hssf.record.chart.LegendRecord;
import org.apache.poi.hssf.record.chart.LinkedDataRecord;
import org.apache.poi.hssf.record.chart.SeriesChartGroupIndexRecord;
import org.apache.poi.hssf.record.chart.SeriesRecord;
import org.apache.poi.hssf.record.chart.SeriesTextRecord;
import org.apache.poi.hssf.record.chart.ValueRangeRecord;
import org.apache.poi.hssf.record.pivottable.DataItemRecord;
import org.apache.poi.hssf.record.pivottable.ExtendedPivotTableViewFieldsRecord;
import org.apache.poi.hssf.record.pivottable.PageItemRecord;
import org.apache.poi.hssf.record.pivottable.StreamIDRecord;
import org.apache.poi.hssf.record.pivottable.ViewDefinitionRecord;
import org.apache.poi.hssf.record.pivottable.ViewFieldsRecord;
import org.apache.poi.hssf.record.pivottable.ViewSourceRecord;
/**
* Title: Record Factory<p>
@ -66,226 +31,7 @@ import org.apache.poi.hssf.record.pivottable.ViewSourceRecord;
public final class RecordFactory {
private static final int NUM_RECORDS = 512;
private interface I_RecordCreator {
Record create(RecordInputStream in);
Class<? extends Record> getRecordClass();
}
private static final class ReflectionConstructorRecordCreator implements I_RecordCreator {
private final Constructor<? extends Record> _c;
public ReflectionConstructorRecordCreator(Constructor<? extends Record> c) {
_c = c;
}
@Override
public Record create(RecordInputStream in) {
Object[] args = { in, };
try {
return _c.newInstance(args);
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
if (t instanceof org.apache.poi.util.RecordFormatException) {
throw (org.apache.poi.util.RecordFormatException)t;
} else if (t instanceof EncryptedDocumentException) {
throw (EncryptedDocumentException)t;
} else {
throw new org.apache.poi.util.RecordFormatException("Unable to construct record instance" , t);
}
}
}
@Override
public Class<? extends Record> getRecordClass() {
return _c.getDeclaringClass();
}
}
/**
* A "create" method is used instead of the usual constructor if the created record might
* be of a different class to the declaring class.
*/
private static final class ReflectionMethodRecordCreator implements I_RecordCreator {
private final Method _m;
public ReflectionMethodRecordCreator(Method m) {
_m = m;
}
@Override
public Record create(RecordInputStream in) {
Object[] args = { in, };
try {
return (org.apache.poi.hssf.record.Record) _m.invoke(null, args);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new org.apache.poi.util.RecordFormatException("Unable to construct record instance" , e.getTargetException());
}
}
@Override
@SuppressWarnings("unchecked")
public Class<? extends Record> getRecordClass() {
return (Class<? extends Record>) _m.getDeclaringClass();
}
}
private static final Class<?>[] CONSTRUCTOR_ARGS = { RecordInputStream.class, };
/**
* contains the classes for all the records we want to parse.<br>
* Note - this most but not *every* subclass of Record.
*/
@SuppressWarnings("unchecked")
private static final Class<? extends Record>[] recordClasses = new Class[] {
ArrayRecord.class,
AutoFilterInfoRecord.class,
BackupRecord.class,
BlankRecord.class,
BOFRecord.class,
BookBoolRecord.class,
BoolErrRecord.class,
BottomMarginRecord.class,
BoundSheetRecord.class,
CalcCountRecord.class,
CalcModeRecord.class,
CFHeaderRecord.class,
CFHeader12Record.class,
CFRuleRecord.class,
CFRule12Record.class,
ChartRecord.class,
ChartTitleFormatRecord.class,
CodepageRecord.class,
ColumnInfoRecord.class,
ContinueRecord.class,
CountryRecord.class,
CRNCountRecord.class,
CRNRecord.class,
DateWindow1904Record.class,
DBCellRecord.class,
DConRefRecord.class,
DefaultColWidthRecord.class,
DefaultRowHeightRecord.class,
DeltaRecord.class,
DimensionsRecord.class,
DrawingGroupRecord.class,
DrawingRecord.class,
DrawingSelectionRecord.class,
DSFRecord.class,
DVALRecord.class,
DVRecord.class,
EOFRecord.class,
ExtendedFormatRecord.class,
ExternalNameRecord.class,
ExternSheetRecord.class,
ExtSSTRecord.class,
FeatRecord.class,
FeatHdrRecord.class,
FilePassRecord.class,
FileSharingRecord.class,
FnGroupCountRecord.class,
FontRecord.class,
FooterRecord.class,
FormatRecord.class,
FormulaRecord.class,
GridsetRecord.class,
GutsRecord.class,
HCenterRecord.class,
HeaderRecord.class,
HeaderFooterRecord.class,
HideObjRecord.class,
HorizontalPageBreakRecord.class,
HyperlinkRecord.class,
IndexRecord.class,
InterfaceEndRecord.class,
InterfaceHdrRecord.class,
IterationRecord.class,
LabelRecord.class,
LabelSSTRecord.class,
LeftMarginRecord.class,
LegendRecord.class,
MergeCellsRecord.class,
MMSRecord.class,
MulBlankRecord.class,
MulRKRecord.class,
NameRecord.class,
NameCommentRecord.class,
NoteRecord.class,
NumberRecord.class,
ObjectProtectRecord.class,
ObjRecord.class,
PaletteRecord.class,
PaneRecord.class,
PasswordRecord.class,
PasswordRev4Record.class,
PrecisionRecord.class,
PrintGridlinesRecord.class,
PrintHeadersRecord.class,
PrintSetupRecord.class,
ProtectionRev4Record.class,
ProtectRecord.class,
RecalcIdRecord.class,
RefModeRecord.class,
RefreshAllRecord.class,
RightMarginRecord.class,
RKRecord.class,
RowRecord.class,
SaveRecalcRecord.class,
ScenarioProtectRecord.class,
SelectionRecord.class,
SeriesRecord.class,
SeriesTextRecord.class,
SharedFormulaRecord.class,
SSTRecord.class,
StringRecord.class,
StyleRecord.class,
SupBookRecord.class,
TabIdRecord.class,
TableRecord.class,
TableStylesRecord.class,
TextObjectRecord.class,
TopMarginRecord.class,
UncalcedRecord.class,
UseSelFSRecord.class,
UserSViewBegin.class,
UserSViewEnd.class,
ValueRangeRecord.class,
VCenterRecord.class,
VerticalPageBreakRecord.class,
WindowOneRecord.class,
WindowProtectRecord.class,
WindowTwoRecord.class,
WriteAccessRecord.class,
WriteProtectRecord.class,
WSBoolRecord.class,
// chart records
BeginRecord.class,
ChartFRTInfoRecord.class,
ChartStartBlockRecord.class,
ChartEndBlockRecord.class,
// TODO ChartFormatRecord.class,
ChartStartObjectRecord.class,
ChartEndObjectRecord.class,
CatLabRecord.class,
DataFormatRecord.class,
EndRecord.class,
LinkedDataRecord.class,
SeriesChartGroupIndexRecord.class,
// pivot table records
DataItemRecord.class,
ExtendedPivotTableViewFieldsRecord.class,
PageItemRecord.class,
StreamIDRecord.class,
ViewDefinitionRecord.class,
ViewFieldsRecord.class,
ViewSourceRecord.class,
};
/**
* cache of the recordsToMap();
*/
private static final Map<Integer, I_RecordCreator> _recordCreatorsById = recordsToMap(recordClasses);
private static short[] _allKnownRecordSIDs;
private RecordFactory() {}
/**
* Debug / diagnosis method<p>
@ -300,11 +46,7 @@ public final class RecordFactory {
* {@code null} if the specified record is not interpreted by POI.
*/
public static Class<? extends Record> getRecordClass(int sid) {
I_RecordCreator rc = _recordCreatorsById.get(Integer.valueOf(sid));
if (rc == null) {
return null;
}
return rc.getRecordClass();
return HSSFRecordTypes.forSID(sid).clazz;
}
/**
@ -330,13 +72,11 @@ public final class RecordFactory {
}
public static org.apache.poi.hssf.record.Record createSingleRecord(RecordInputStream in) {
I_RecordCreator constructor = _recordCreatorsById.get(Integer.valueOf(in.getSid()));
if (constructor == null) {
return new UnknownRecord(in);
HSSFRecordTypes rec = HSSFRecordTypes.forSID(in.getSid());
if (!rec.isParseable()) {
rec = HSSFRecordTypes.UNKNOWN;
}
return constructor.create(in);
return rec.recordConstructor.apply(in);
}
/**
@ -399,76 +139,14 @@ public final class RecordFactory {
* @return an array of all the SIDS for all known records
*/
public static short[] getAllKnownRecordSIDs() {
if (_allKnownRecordSIDs == null) {
short[] results = new short[ _recordCreatorsById.size() ];
int i = 0;
for (Integer sid : _recordCreatorsById.keySet()) {
results[i++] = sid.shortValue();
}
Arrays.sort(results);
_allKnownRecordSIDs = results;
int[] intSid = Arrays.stream(HSSFRecordTypes.values()).mapToInt(HSSFRecordTypes::getSid).toArray();
short[] shortSid = new short[intSid.length];
for (int i=0; i<intSid.length; i++) {
shortSid[i] = (short)intSid[i];
}
return _allKnownRecordSIDs.clone();
return shortSid;
}
/**
* gets the record constructors and sticks them in the map by SID
* @return map of SIDs to short,short,byte[] constructors for Record classes
* most of org.apache.poi.hssf.record.*
*/
private static Map<Integer, I_RecordCreator> recordsToMap(Class<? extends Record> [] records) {
Map<Integer, I_RecordCreator> result = new HashMap<>();
Set<Class<?>> uniqueRecClasses = new HashSet<>(records.length * 3 / 2);
for (Class<? extends Record> recClass : records) {
if(!Record.class.isAssignableFrom(recClass)) {
throw new RuntimeException("Invalid record sub-class (" + recClass.getName() + ")");
}
if(Modifier.isAbstract(recClass.getModifiers())) {
throw new RuntimeException("Invalid record class (" + recClass.getName() + ") - must not be abstract");
}
if(!uniqueRecClasses.add(recClass)) {
throw new RuntimeException("duplicate record class (" + recClass.getName() + ")");
}
int sid;
try {
sid = recClass.getField("sid").getShort(null);
} catch (Exception illegalArgumentException) {
throw new org.apache.poi.util.RecordFormatException(
"Unable to determine record types");
}
Integer key = Integer.valueOf(sid);
if (result.containsKey(key)) {
Class<?> prevClass = result.get(key).getRecordClass();
throw new RuntimeException("duplicate record sid 0x" +
Integer.toHexString(sid).toUpperCase(Locale.ROOT)
+ " for classes (" + recClass.getName() + ") and ("
+ prevClass.getName() + ")");
}
result.put(key, getRecordCreator(recClass));
}
// result.put(Integer.valueOf(0x0406), result.get(Integer.valueOf(0x06)));
return result;
}
private static I_RecordCreator getRecordCreator(Class<? extends Record> recClass) {
try {
Constructor<? extends Record> constructor;
constructor = recClass.getConstructor(CONSTRUCTOR_ARGS);
return new ReflectionConstructorRecordCreator(constructor);
} catch (NoSuchMethodException e) {
// fall through and look for other construction methods
}
try {
Method m = recClass.getDeclaredMethod("create", CONSTRUCTOR_ARGS);
return new ReflectionMethodRecordCreator(m);
} catch (NoSuchMethodException e) {
throw new RuntimeException("Failed to find constructor or create method for (" + recClass.getName() + ").");
}
}
/**
* Create an array of records from an input stream
*

View File

@ -18,9 +18,11 @@
package org.apache.poi.hssf.record;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.apache.poi.common.Duplicatable;
import org.apache.poi.common.usermodel.GenericRecord;
@ -50,8 +52,6 @@ public abstract class SubRecord implements Duplicatable, GenericRecord {
COMMON_OBJECT_DATA(0x0015, CommonObjectDataSubRecord::new),
;
@FunctionalInterface
public interface RecordConstructor<T extends SubRecord> {
/**
@ -65,14 +65,8 @@ public abstract class SubRecord implements Duplicatable, GenericRecord {
T apply(LittleEndianInput in, int size, int cmoOt);
}
private static final Map<Short,SubRecordTypes> LOOKUP;
static {
LOOKUP = new HashMap<>();
for(SubRecordTypes s : values()) {
LOOKUP.put(s.sid, s);
}
}
private static final Map<Short,SubRecordTypes> LOOKUP =
Arrays.stream(values()).collect(Collectors.toMap(SubRecordTypes::getSid, Function.identity()));
public final short sid;
public final RecordConstructor<?> recordConstructor;
@ -82,10 +76,13 @@ public abstract class SubRecord implements Duplicatable, GenericRecord {
this.recordConstructor = recordConstructor;
}
public static SubRecordTypes forTypeID(int typeID) {
return LOOKUP.getOrDefault((short)typeID, UNKNOWN);
public static SubRecordTypes forSID(int sid) {
return LOOKUP.getOrDefault((short)sid, UNKNOWN);
}
public short getSid() {
return sid;
}
}
@ -106,29 +103,10 @@ public abstract class SubRecord implements Duplicatable, GenericRecord {
*/
public static SubRecord createSubRecord(LittleEndianInput in, int cmoOt) {
int sid = in.readUShort();
int secondUShort = in.readUShort(); // Often (but not always) the datasize for the sub-record
switch (sid) {
case CommonObjectDataSubRecord.sid:
return new CommonObjectDataSubRecord(in, secondUShort);
case EmbeddedObjectRefSubRecord.sid:
return new EmbeddedObjectRefSubRecord(in, secondUShort);
case GroupMarkerSubRecord.sid:
return new GroupMarkerSubRecord(in, secondUShort);
case EndSubRecord.sid:
return new EndSubRecord(in, secondUShort);
case NoteStructureSubRecord.sid:
return new NoteStructureSubRecord(in, secondUShort);
case LbsDataSubRecord.sid:
return new LbsDataSubRecord(in, secondUShort, cmoOt);
case FtCblsSubRecord.sid:
return new FtCblsSubRecord(in, secondUShort);
case FtPioGrbitSubRecord.sid:
return new FtPioGrbitSubRecord(in, secondUShort);
case FtCfSubRecord.sid:
return new FtCfSubRecord(in, secondUShort);
}
return new UnknownSubRecord(in, sid, secondUShort);
// Often (but not always) the datasize for the sub-record
int size = in.readUShort();
SubRecordTypes srt = SubRecordTypes.forSID(sid);
return srt.recordConstructor.apply(in, size, srt == SubRecordTypes.UNKNOWN ? sid : cmoOt);
}
@Override
@ -172,7 +150,7 @@ public abstract class SubRecord implements Duplicatable, GenericRecord {
private final int _sid;
private final byte[] _data;
public UnknownSubRecord(LittleEndianInput in, int sid, int size) {
public UnknownSubRecord(LittleEndianInput in, int size, int sid) {
_sid = sid;
byte[] buf = IOUtils.safelyAllocate(size, MAX_RECORD_LENGTH);
in.readFully(buf);

View File

@ -52,8 +52,8 @@ public final class SupBookRecord extends StandardRecord {
private short field_1_number_of_sheets;
private String field_2_encoded_url;
private String[] field_3_sheet_names;
private boolean _isAddInFunctions;
private final String[] field_3_sheet_names;
private final boolean _isAddInFunctions;
public SupBookRecord(SupBookRecord other) {
super(other);
@ -185,14 +185,16 @@ public final class SupBookRecord extends StandardRecord {
}
public String getURL() {
String encodedUrl = field_2_encoded_url;
switch(encodedUrl == null ? -1 : encodedUrl.charAt(0)) {
case 0: // Reference to an empty workbook name
return encodedUrl.substring(1); // will this just be empty string?
case 1: // encoded file name
return decodeFileName(encodedUrl);
case 2: // Self-referential external reference
return encodedUrl.substring(1);
if (encodedUrl != null && encodedUrl.length() >= 2) {
switch(encodedUrl.charAt(0)) {
case 0: // Reference to an empty workbook name
case 2: // Self-referential external reference
// will this just be empty string?
return encodedUrl.substring(1);
case 1: // encoded file name
return decodeFileName(encodedUrl);
}
}
return encodedUrl;
}
@ -212,9 +214,7 @@ public final class SupBookRecord extends StandardRecord {
}
break;
case CH_SAME_VOLUME:
sb.append(PATH_SEPERATOR);
break;
case CH_DOWN_DIR:
case CH_DOWN_DIR:
sb.append(PATH_SEPERATOR);
break;
case CH_UP_DIR: