Author: kiwiwings
Date: Sun Apr 12 22:03:52 2020
New Revision: 1876433

URL: http://svn.apache.org/viewvc?rev=1876433&view=rev
Log:
#63745 - Add traversing and debugging interface to HSSF

This makes toString() implementations obsolete.

This also contains preparation for #64036 to (maybe) change the record factory 
interface of HSSF. 

Remove duplicated record SeriesToChartGroupRecord, which is a duplicate of 
SeriesChartGroupIndexRecord.

Added:
    poi/trunk/src/java/org/apache/poi/hssf/record/HSSFRecordTypes.java   (with 
props)
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ArrayInitialPtg.java
      - copied, changed from r1876397, 
poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ArrayPtg.java
Removed:
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/SeriesToChartGroupRecord.java
    
poi/trunk/src/testcases/org/apache/poi/hssf/record/chart/TestSeriesToChartGroupRecord.java
Modified:
    poi/site/src/documentation/content/xdocs/changes.xml
    poi/trunk/src/java/org/apache/poi/common/usermodel/GenericRecord.java
    poi/trunk/src/java/org/apache/poi/hpsf/ClassID.java
    poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java
    
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/DummyRecordBase.java
    
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/LastCellOfRowDummyRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingCellDummyRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingRowDummyRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ArrayRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/BackupRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/BlankRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/BookBoolRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/BoolErrRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/BottomMarginRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderBase.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CRNCountRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CRNRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CalcCountRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CalcModeRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CellRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CodepageRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ContinueRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CountryRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DBCellRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DConRefRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DSFRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DVALRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DVRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DateWindow1904Record.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DefaultColWidthRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DefaultRowHeightRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DeltaRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DimensionsRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DrawingGroupRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DrawingRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/DrawingRecordForBiffViewer.java
    poi/trunk/src/java/org/apache/poi/hssf/record/DrawingSelectionRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/EOFRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/EmbeddedObjectRefSubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/EndSubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/EscherAggregate.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ExtSSTRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ExtendedFormatRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ExternSheetRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ExternalNameRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FeatHdrRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FeatRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FilePassRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FileSharingRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FnGroupCountRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FontRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FooterRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FormatRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FormulaSpecialCachedValue.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FtCfSubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FtPioGrbitSubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/GridsetRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/GroupMarkerSubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/GutsRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/HCenterRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterBase.java
    poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/HeaderRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/HideObjRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/HorizontalPageBreakRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/HyperlinkRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/IndexRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceEndRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceHdrRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/IterationRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/LabelRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/LabelSSTRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/LeftMarginRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/MMSRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/MulBlankRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/MulRKRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/NameCommentRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/NoteRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/NoteStructureSubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/NumberRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ObjRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ObjectProtectRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/PageBreakRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/PaletteRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/PaneRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/PasswordRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/PasswordRev4Record.java
    poi/trunk/src/java/org/apache/poi/hssf/record/PrecisionRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/PrintGridlinesRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/PrintHeadersRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/PrintSetupRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ProtectRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ProtectionRev4Record.java
    poi/trunk/src/java/org/apache/poi/hssf/record/RKRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/RecalcIdRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/Record.java
    poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java
    poi/trunk/src/java/org/apache/poi/hssf/record/RefModeRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/RefreshAllRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/RightMarginRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/RowRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/SCLRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/SaveRecalcRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/ScenarioProtectRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/SelectionRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/StringRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/StyleRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/SubRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/SupBookRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/TabIdRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/TableRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/TableStylesRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/TextObjectRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/TopMarginRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/UncalcedRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/UseSelFSRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewBegin.java
    poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewEnd.java
    poi/trunk/src/java/org/apache/poi/hssf/record/VCenterRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/VerticalPageBreakRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/WSBoolRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/WindowOneRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/WindowProtectRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/WindowTwoRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/WriteAccessRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/WriteProtectRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaFormatRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisLineFormatRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisOptionsRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisParentRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisUsedRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/BarRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/BeginRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/CatLabRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/CategorySeriesAxisRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndBlockRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFRTInfoRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFormatRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartStartBlockRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartStartObjectRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartTitleFormatRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/DatRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/DataFormatRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/DataLabelExtensionRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/DefaultDataLabelTextPropertiesRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/EndRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/FontBasisRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/FontIndexRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/FrameRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/LegendRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/LineFormatRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/LinkedDataRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/NumberFormatIndexRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/ObjectLinkRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/PlotAreaRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/PlotGrowthRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/SeriesChartGroupIndexRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/SeriesIndexRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/SeriesLabelsRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/SeriesListRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/SeriesRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/SeriesTextRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/chart/SheetPropertiesRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/TextRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/TickRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/UnitsRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/chart/ValueRangeRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/common/ExtRst.java
    poi/trunk/src/java/org/apache/poi/hssf/record/common/FeatFormulaErr2.java
    poi/trunk/src/java/org/apache/poi/hssf/record/common/FeatProtection.java
    poi/trunk/src/java/org/apache/poi/hssf/record/common/FeatSmartTag.java
    poi/trunk/src/java/org/apache/poi/hssf/record/common/FormatRun.java
    poi/trunk/src/java/org/apache/poi/hssf/record/common/FtrHeader.java
    poi/trunk/src/java/org/apache/poi/hssf/record/common/SharedFeature.java
    poi/trunk/src/java/org/apache/poi/hssf/record/common/UnicodeString.java
    poi/trunk/src/java/org/apache/poi/hssf/record/pivottable/DataItemRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/pivottable/ExtendedPivotTableViewFieldsRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/pivottable/PageItemRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/pivottable/StreamIDRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/pivottable/ViewDefinitionRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/pivottable/ViewFieldsRecord.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/pivottable/ViewSourceRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFChart.java
    poi/trunk/src/java/org/apache/poi/poifs/crypt/Decryptor.java
    poi/trunk/src/java/org/apache/poi/poifs/crypt/Encryptor.java
    poi/trunk/src/java/org/apache/poi/ss/formula/Formula.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AbstractFunctionPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ArrayPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AttrPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/BoolPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedArea3DPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedRef3DPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ErrPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ExpPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/FuncVarPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/IntPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemAreaPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemErrPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemFuncPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MissingArgPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NamePtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NumberPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/OperationPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ParenthesisPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ptg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref2DPtgBase.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefErrorPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefPtgBase.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ScalarConstantPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/StringPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/TblPtg.java
    poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnknownPtg.java
    poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddressBase.java
    poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddressList.java
    poi/trunk/src/java/org/apache/poi/ss/util/CellReference.java
    poi/trunk/src/java/org/apache/poi/util/BitField.java
    poi/trunk/src/java/org/apache/poi/util/GenericRecordJsonWriter.java
    poi/trunk/src/java/org/apache/poi/util/GenericRecordUtil.java
    poi/trunk/src/java/org/apache/poi/util/IntMapper.java
    
poi/trunk/src/testcases/org/apache/poi/hssf/record/chart/AllChartRecordTests.java
    poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java
    poi/trunk/src/testcases/org/apache/poi/ss/formula/ptg/TestArrayPtg.java

Modified: poi/site/src/documentation/content/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/poi/site/src/documentation/content/xdocs/changes.xml?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/site/src/documentation/content/xdocs/changes.xml (original)
+++ poi/site/src/documentation/content/xdocs/changes.xml Sun Apr 12 22:03:52 
2020
@@ -89,6 +89,7 @@
             <action type="fix" fixes-bug="github-170" 
context="XWPF">XWPFTableCell does not process bodyElements when handle 
paragraph</action>
             <action type="fix" fixes-bug="github-171" 
context="XWPF">XWPFNumbering.addAbstractNum will definitely throw an 
exception</action>
             <action type="fix" fixes-bug="64301" context="OPC">Allow 
try-with-resources with OPCPackage.revert()</action>
+            <action type="fix" fixes-bug="63745" context="HSSF">Add traversing 
and debugging interface to HSSF</action>
         </actions>
     </release>
 

Modified: poi/trunk/src/java/org/apache/poi/common/usermodel/GenericRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/common/usermodel/GenericRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/common/usermodel/GenericRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/common/usermodel/GenericRecord.java Sun 
Apr 12 22:03:52 2020
@@ -24,7 +24,7 @@ import java.util.Map;
 import java.util.function.Supplier;
 
 public interface GenericRecord {
-    default Enum getGenericRecordType() { return null; }
+    default Enum<?> getGenericRecordType() { return null; }
 
     Map<String, Supplier<?>> getGenericProperties();
 

Modified: poi/trunk/src/java/org/apache/poi/hpsf/ClassID.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hpsf/ClassID.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hpsf/ClassID.java (original)
+++ poi/trunk/src/java/org/apache/poi/hpsf/ClassID.java Sun Apr 12 22:03:52 2020
@@ -20,9 +20,13 @@ package org.apache.poi.hpsf;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Locale;
+import java.util.Map;
 import java.util.UUID;
+import java.util.function.Supplier;
 
 import org.apache.poi.common.Duplicatable;
+import org.apache.poi.common.usermodel.GenericRecord;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
@@ -34,7 +38,7 @@ import org.apache.poi.util.LittleEndianO
  *
  * The ClassID (or CLSID) is a UUID - see RFC 4122
  */
-public class ClassID implements Duplicatable {
+public class ClassID implements Duplicatable, GenericRecord {
     /** @deprecated use enum {@link ClassIDPredefined} */ @Deprecated
     public static final ClassID OLE10_PACKAGE  = 
ClassIDPredefined.OLE_V1_PACKAGE.getClassID();
     /** @deprecated use enum {@link ClassIDPredefined} */ @Deprecated
@@ -344,4 +348,9 @@ public class ClassID implements Duplicat
     public ClassID copy() {
         return new ClassID(this);
     }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties("uuid", this::toString);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java Sun Apr 12 
22:03:52 2020
@@ -139,7 +139,7 @@ public final class BiffViewer {
             case CFHeader12Record.sid:        return new CFHeader12Record(in);
             case CFRuleRecord.sid:            return new CFRuleRecord(in);
             case CFRule12Record.sid:          return new CFRule12Record(in);
-            // TODO Add CF Ex, and remove from UnknownRecord 
+            // TODO Add CF Ex, and remove from UnknownRecord
             case CalcCountRecord.sid:         return new CalcCountRecord(in);
             case CalcModeRecord.sid:          return new CalcModeRecord(in);
             case CategorySeriesAxisRecord.sid:return new 
CategorySeriesAxisRecord(in);
@@ -236,7 +236,7 @@ public final class BiffViewer {
             case SeriesListRecord.sid:        return new SeriesListRecord(in);
             case SeriesRecord.sid:            return new SeriesRecord(in);
             case SeriesTextRecord.sid:        return new SeriesTextRecord(in);
-            case SeriesToChartGroupRecord.sid:return new 
SeriesToChartGroupRecord(in);
+            case SeriesChartGroupIndexRecord.sid:return new 
SeriesChartGroupIndexRecord(in);
             case SharedFormulaRecord.sid:     return new 
SharedFormulaRecord(in);
             case SheetPropertiesRecord.sid:   return new 
SheetPropertiesRecord(in);
             case StringRecord.sid:            return new StringRecord(in);
@@ -383,8 +383,8 @@ public final class BiffViewer {
         * <tr><td>--escher</td><td>turn on deserialization of escher records 
(default is off)</td></tr>
         * <tr><td>--noheader</td><td>do not print record header (default is 
on)</td></tr>
         * </table>
-        * 
-        * @param args the command line arguments 
+        *
+        * @param args the command line arguments
         *
         * @throws IOException if the file doesn't exist or contained errors
         * @throws CommandParseException if the command line contained errors
@@ -676,7 +676,7 @@ public final class BiffViewer {
                        }
 
                        idx = arraycopy(NEW_LINE_CHARS, buf, idx);
-                       
+
                        w.write(buf, 0, idx);
                } catch (IOException e) {
                        throw new RuntimeException(e);
@@ -690,7 +690,7 @@ public final class BiffViewer {
            }
            return idx;
        }
-       
+
        private static char getPrintableChar(byte b) {
                char ib = (char) (b & 0x00FF);
                if (ib < 32 || ib > 126) {

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/DummyRecordBase.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/DummyRecordBase.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/DummyRecordBase.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/DummyRecordBase.java
 Sun Apr 12 22:03:52 2020
@@ -35,4 +35,6 @@ abstract class DummyRecordBase extends R
        public final int getRecordSize() {
                throw new RecordFormatException("Cannot serialize a dummy 
record");
        }
+
+
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/LastCellOfRowDummyRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/LastCellOfRowDummyRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/LastCellOfRowDummyRecord.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/LastCellOfRowDummyRecord.java
 Sun Apr 12 22:03:52 2020
@@ -18,6 +18,12 @@
 package org.apache.poi.hssf.eventusermodel.dummyrecord;
 
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
+import org.apache.poi.util.GenericRecordUtil;
+
 /**
  * A dummy record to indicate that we've now had the last
  *  cell record for this row.
@@ -55,12 +61,20 @@ public final class LastCellOfRowDummyRec
     }
 
        @Override
-       public String toString() {
-           return "End-of-Row for Row=" + row + " at Column=" + 
lastColumnNumber;
+       public LastCellOfRowDummyRecord copy() {
+               return this;
        }
 
        @Override
-       public LastCellOfRowDummyRecord copy() {
-               return this;
+       public HSSFRecordTypes getGenericRecordType() {
+               return null;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "row", this::getRow,
+                       "lastColumnNumber", this::getLastColumnNumber
+               );
        }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingCellDummyRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingCellDummyRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingCellDummyRecord.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingCellDummyRecord.java
 Sun Apr 12 22:03:52 2020
@@ -18,6 +18,12 @@
 package org.apache.poi.hssf.eventusermodel.dummyrecord;
 
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
+import org.apache.poi.util.GenericRecordUtil;
+
 /**
  * A dummy record for when we're missing a cell in a row,
  *  but still want to trigger something
@@ -37,4 +43,17 @@ public final class MissingCellDummyRecor
        public MissingCellDummyRecord copy() {
                return this;
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return null;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "row", this::getRow,
+                       "column", this::getColumn
+               );
+       }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingRowDummyRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingRowDummyRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingRowDummyRecord.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/dummyrecord/MissingRowDummyRecord.java
 Sun Apr 12 22:03:52 2020
@@ -18,6 +18,12 @@
 package org.apache.poi.hssf.eventusermodel.dummyrecord;
 
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
+import org.apache.poi.util.GenericRecordUtil;
+
 /**
  * A dummy record for when we're missing a row, but still
  *  want to trigger something
@@ -36,4 +42,16 @@ public final class MissingRowDummyRecord
        public MissingRowDummyRecord copy() {
                return this;
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return null;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "rowNumber", this::getRowNumber
+               );
+       }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java 
(original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java 
Sun Apr 12 22:03:52 2020
@@ -82,23 +82,6 @@ public abstract class AbstractEscherHold
         }
     }
 
-    @Override
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        final String nl = System.getProperty("line.separator");
-        buffer.append('[' + getRecordName() + ']' + nl);
-        if (escherRecords.size() == 0)
-            buffer.append("No Escher Records Decoded" + nl);
-        for (EscherRecord r : escherRecords) {
-            buffer.append(r);
-        }
-        buffer.append("[/" + getRecordName() + ']' + nl);
-
-        return buffer.toString();
-    }
-
     protected abstract String getRecordName();
 
     @Override
@@ -268,4 +251,9 @@ public abstract class AbstractEscherHold
             convertToEscherRecords(0, rawData.length, rawData );
         }
     }
+
+    @Override
+    public List<EscherRecord> getGenericChildren() {
+        return escherRecords;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/ArrayRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/ArrayRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/ArrayRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/ArrayRecord.java Sun Apr 12 
22:03:52 2020
@@ -17,10 +17,13 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.hssf.util.CellRangeAddress8Bit;
 import org.apache.poi.ss.formula.Formula;
 import org.apache.poi.ss.formula.ptg.Ptg;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -86,24 +89,8 @@ public final class ArrayRecord extends S
                return sid;
        }
 
-       public String toString() {
-               StringBuilder sb = new StringBuilder();
-               sb.append(getClass().getName()).append(" [ARRAY]\n");
-               sb.append(" range=").append(getRange()).append("\n");
-               sb.append(" 
options=").append(HexDump.shortToHex(_options)).append("\n");
-               sb.append(" 
notUsed=").append(HexDump.intToHex(_field3notUsed)).append("\n");
-               sb.append(" formula:").append("\n");
-               Ptg[] ptgs = _formula.getTokens();
-               for (int i = 0; i < ptgs.length; i++) {
-                       Ptg ptg = ptgs[i];
-                       sb.append(ptg).append(ptg.getRVAType()).append("\n");
-               }
-               sb.append("]");
-               return sb.toString();
-       }
-
        @Override
-       @SuppressWarnings("squid:S2975")
+       @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
        @Deprecated
        @Removal(version = "5.0.0")
        public ArrayRecord clone() {
@@ -114,4 +101,19 @@ public final class ArrayRecord extends S
     public ArrayRecord copy() {
         return new ArrayRecord(this);
     }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.ARRAY;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "range", this::getRange,
+                       "options", () -> _options,
+                       "notUsed", () -> _field3notUsed,
+                       "formula", () -> _formula
+               );
+       }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java Sun 
Apr 12 22:03:52 2020
@@ -19,6 +19,10 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -67,17 +71,6 @@ public final class AutoFilterInfoRecord
         return _cEntries;
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[AUTOFILTERINFO]\n");
-        buffer.append("    .numEntries          = ")
-            .append(_cEntries).append("\n");
-        buffer.append("[/AUTOFILTERINFO]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(_cEntries);
     }
@@ -92,7 +85,7 @@ public final class AutoFilterInfoRecord
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public AutoFilterInfoRecord clone() {
@@ -103,4 +96,16 @@ public final class AutoFilterInfoRecord
     public AutoFilterInfoRecord copy() {
         return new AutoFilterInfoRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.AUTO_FILTER_INFO;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "numEntries", this::getNumEntries
+        );
+    }
 }
\ No newline at end of file

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java Sun Apr 12 
22:03:52 2020
@@ -17,7 +17,11 @@
 
 package org.apache.poi.hssf.record;
 
-import org.apache.poi.util.HexDump;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -229,21 +233,6 @@ public final class BOFRecord extends Sta
         return field_6_rversion;
     }
 
-    public String toString() {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[BOF RECORD]\n");
-        buffer.append("    .version  = 
").append(HexDump.shortToHex(getVersion())).append("\n");
-        buffer.append("    .type     = 
").append(HexDump.shortToHex(getType()));
-        buffer.append(" (").append(getTypeName()).append(")").append("\n");
-        buffer.append("    .build    = 
").append(HexDump.shortToHex(getBuild())).append("\n");
-        buffer.append("    .buildyear= ").append(getBuildYear()).append("\n");
-        buffer.append("    .history  = 
").append(HexDump.intToHex(getHistoryBitMask())).append("\n");
-        buffer.append("    .reqver   = 
").append(HexDump.intToHex(getRequiredVersion())).append("\n");
-        buffer.append("[/BOF RECORD]\n");
-        return buffer.toString();
-    }
-
     private String getTypeName() {
         switch(field_2_type) {
             case TYPE_CHART: return "chart";
@@ -274,7 +263,7 @@ public final class BOFRecord extends Sta
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public BOFRecord clone() {
@@ -285,4 +274,22 @@ public final class BOFRecord extends Sta
     public BOFRecord copy() {
         return new BOFRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.BOF;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        final Map<String,Supplier<?>> m = new LinkedHashMap<>();
+        m.put("version", this::getVersion);
+        m.put("type", this::getType);
+        m.put("typeName", this::getTypeName);
+        m.put("build", this::getBuild);
+        m.put("buildYear", this::getBuildYear);
+        m.put("history", this::getHistoryBitMask);
+        m.put("requiredVersion", this::getRequiredVersion);
+        return Collections.unmodifiableMap(m);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/BackupRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/BackupRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/BackupRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/BackupRecord.java Sun Apr 12 
22:03:52 2020
@@ -19,6 +19,10 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
@@ -65,17 +69,6 @@ public final class BackupRecord extends
         return field_1_backup;
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[BACKUP]\n");
-        buffer.append("    .backup          = ")
-            .append(Integer.toHexString(getBackup())).append("\n");
-        buffer.append("[/BACKUP]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(getBackup());
     }
@@ -93,4 +86,16 @@ public final class BackupRecord extends
     public BackupRecord copy() {
         return new BackupRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.BACKUP;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "backup", this::getBackup
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/BlankRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/BlankRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/BlankRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/BlankRecord.java Sun Apr 12 
22:03:52 2020
@@ -17,7 +17,10 @@
 
 package org.apache.poi.hssf.record;
 
-import org.apache.poi.util.HexDump;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -119,18 +122,6 @@ public final class BlankRecord extends S
         return sid;
     }
 
-    public String toString()
-    {
-        StringBuilder sb = new StringBuilder();
-
-        sb.append("[BLANK]\n");
-        sb.append("    row= 
").append(HexDump.shortToHex(getRow())).append("\n");
-        sb.append("    col= 
").append(HexDump.shortToHex(getColumn())).append("\n");
-        sb.append("    xf = 
").append(HexDump.shortToHex(getXFIndex())).append("\n");
-        sb.append("[/BLANK]\n");
-        return sb.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(getRow());
         out.writeShort(getColumn());
@@ -142,7 +133,7 @@ public final class BlankRecord extends S
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public BlankRecord clone() {
@@ -153,4 +144,18 @@ public final class BlankRecord extends S
     public BlankRecord copy() {
         return new BlankRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.BLANK;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "row", this::getRow,
+            "col", this::getColumn,
+            "xfIndex", this::getXFIndex
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/BookBoolRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/BookBoolRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/BookBoolRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/BookBoolRecord.java Sun Apr 
12 22:03:52 2020
@@ -19,6 +19,10 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
@@ -65,17 +69,6 @@ public final class BookBoolRecord extend
         return field_1_save_link_values;
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[BOOKBOOL]\n");
-        buffer.append("    .savelinkvalues  = ")
-            .append(Integer.toHexString(getSaveLinkValues())).append("\n");
-        buffer.append("[/BOOKBOOL]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_save_link_values);
     }
@@ -93,4 +86,16 @@ public final class BookBoolRecord extend
     public BookBoolRecord copy() {
         return new BookBoolRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.BOOK_BOOL;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "saveLinkValues", this::getSaveLinkValues
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/BoolErrRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/BoolErrRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/BoolErrRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/BoolErrRecord.java Sun Apr 12 
22:03:52 2020
@@ -17,8 +17,11 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.ss.usermodel.FormulaError;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.RecordFormatException;
 import org.apache.poi.util.Removal;
@@ -159,17 +162,7 @@ public final class BoolErrRecord extends
        protected String getRecordName() {
                return "BOOLERR";
        }
-       @Override
-       protected void appendValueText(StringBuilder sb) {
-               if (isBoolean()) {
-                       sb.append("  .boolVal = ");
-                       sb.append(getBooleanValue());
-               } else {
-                       sb.append("  .errCode = ");
-                       
sb.append(FormulaError.forInt(getErrorValue()).getString());
-                       sb.append(" 
(").append(HexDump.byteToHex(getErrorValue())).append(")");
-               }
-       }
+
        @Override
        protected void serializeValue(LittleEndianOutput out) {
                out.writeByte(_value);
@@ -186,7 +179,7 @@ public final class BoolErrRecord extends
        }
 
        @Override
-       @SuppressWarnings("squid:S2975")
+       @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
        @Deprecated
        @Removal(version = "5.0.0")
        public BoolErrRecord clone() {
@@ -197,4 +190,21 @@ public final class BoolErrRecord extends
        public BoolErrRecord copy() {
                return new BoolErrRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.BOOL_ERR;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "base", super::getGenericProperties,
+                       "isBoolean", this::isBoolean,
+                       "booleanVal", this::getBooleanValue,
+                       "isError", this::isError,
+                       "errorVal", this::getErrorValue,
+                       "errorTxt", () -> isError() ? 
FormulaError.forInt(getErrorValue()).getString() : null
+               );
+       }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/BottomMarginRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/BottomMarginRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/BottomMarginRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/BottomMarginRecord.java Sun 
Apr 12 22:03:52 2020
@@ -19,6 +19,10 @@
 package org.apache.poi.hssf.record;
 
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -41,16 +45,6 @@ public final class BottomMarginRecord ex
         field_1_margin = in.readDouble();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-        buffer.append( "[BottomMargin]\n" );
-        buffer.append( "    .margin               = " )
-                .append( " (" ).append( getMargin() ).append( " )\n" );
-        buffer.append( "[/BottomMargin]\n" );
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeDouble(field_1_margin);
     }
@@ -81,7 +75,7 @@ public final class BottomMarginRecord ex
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public BottomMarginRecord clone() {
@@ -92,4 +86,16 @@ public final class BottomMarginRecord ex
     public BottomMarginRecord copy() {
         return new BottomMarginRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.BOTTOM_MARGIN;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "margin", this::getMargin
+        );
+    }
 }
\ No newline at end of file

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java Sun Apr 
12 22:03:52 2020
@@ -19,11 +19,13 @@ package org.apache.poi.hssf.record;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
 
 import org.apache.poi.ss.util.WorkbookUtil;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.LittleEndianConsts;
 import org.apache.poi.util.LittleEndianOutput;
@@ -125,18 +127,6 @@ public final class BoundSheetRecord exte
                return field_5_sheetname;
        }
 
-       public String toString() {
-               StringBuilder buffer = new StringBuilder();
-
-               buffer.append("[BOUNDSHEET]\n");
-               buffer.append("    .bof        = 
").append(HexDump.intToHex(getPositionOfBof())).append("\n");
-               buffer.append("    .options    = 
").append(HexDump.shortToHex(field_2_option_flags)).append("\n");
-               buffer.append("    .unicodeflag= 
").append(HexDump.byteToHex(field_4_isMultibyteUnicode)).append("\n");
-               buffer.append("    .sheetname  = 
").append(field_5_sheetname).append("\n");
-               buffer.append("[/BOUNDSHEET]\n");
-               return buffer.toString();
-       }
-
        protected int getDataSize() {
                return 8 + field_5_sheetname.length() * (isMultibyte() ? 2 : 1);
        }
@@ -219,4 +209,21 @@ public final class BoundSheetRecord exte
        public BoundSheetRecord copy() {
                return new BoundSheetRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.BOUND_SHEET;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "bof", this::getPositionOfBof,
+                       "optionFlags", () -> field_2_option_flags,
+                       "multiByte", this::isMultibyte,
+                       "sheetName", this::getSheetname,
+                       "hidden", this::isHidden,
+                       "veryHidden", this::isVeryHidden
+               );
+       }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java Sun Apr 
12 22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.hssf.record.common.FtrHeader;
 import org.apache.poi.hssf.record.common.FutureRecord;
 import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -97,4 +101,17 @@ public final class CFHeader12Record exte
     public CFHeader12Record copy() {
         return new CFHeader12Record(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CF_HEADER_12;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "base", super::getGenericProperties,
+            "futureHeader", this::getFutureHeader
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderBase.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderBase.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderBase.java Sun Apr 12 
22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellRangeAddressList;
 import org.apache.poi.ss.util.CellRangeUtil;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -129,23 +133,6 @@ public abstract class CFHeaderBase exten
 
     protected abstract String getRecordName();
 
-    public String toString() {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[").append(getRecordName()).append("]\n");
-        buffer.append("\t.numCF             = 
").append(getNumberOfConditionalFormats()).append("\n");
-        buffer.append("\t.needRecalc        = 
").append(getNeedRecalculation()).append("\n");
-        buffer.append("\t.id                = ").append(getID()).append("\n");
-        buffer.append("\t.enclosingCellRange= 
").append(getEnclosingCellRange()).append("\n");
-        buffer.append("\t.cfranges=[");
-        for( int i=0; i<field_4_cell_ranges.countRanges(); i++) {
-            
buffer.append(i==0?"":",").append(field_4_cell_ranges.getCellRangeAddress(i));
-        }
-        buffer.append("]\n");
-        buffer.append("[/").append(getRecordName()).append("]\n");
-        return buffer.toString();
-    }
-
     protected int getDataSize() {
         return 4 // 2 short fields
              + CellRangeAddress.ENCODED_SIZE
@@ -167,4 +154,15 @@ public abstract class CFHeaderBase exten
 
     @Override
     public abstract CFHeaderBase copy();
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "id", this::getID,
+            "numCF", this::getNumberOfConditionalFormats,
+            "needRecalculationAndId", this::getNeedRecalculation,
+            "enclosingCellRange", this::getEnclosingCellRange,
+            "cfRanges", this::getCellRanges
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java Sun Apr 
12 22:03:52 2020
@@ -64,4 +64,9 @@ public final class CFHeaderRecord extend
     public CFHeaderRecord copy() {
         return new CFHeaderRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CF_HEADER;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java Sun Apr 
12 22:03:52 2020
@@ -17,7 +17,10 @@
 
 package org.apache.poi.hssf.record;
 
-import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.function.Supplier;
 
 import org.apache.poi.hssf.record.cf.ColorGradientFormatting;
 import org.apache.poi.hssf.record.cf.ColorGradientThreshold;
@@ -35,7 +38,6 @@ import org.apache.poi.ss.formula.ptg.Ptg
 import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold.RangeType;
 import org.apache.poi.ss.usermodel.IconMultiStateFormatting.IconSet;
 import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.util.HexDump;
 import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.POILogger;
@@ -447,43 +449,6 @@ public final class CFRule12Record extend
         return len;
     }
 
-    public String toString() {
-        StringBuilder buffer = new StringBuilder();
-        buffer.append("[CFRULE12]\n");
-        buffer.append("    
.condition_type=").append(getConditionType()).append("\n");
-        buffer.append("    .dxfn12_length 
=0x").append(Integer.toHexString(ext_formatting_length)).append("\n");
-        buffer.append("    .option_flags  
=0x").append(Integer.toHexString(getOptions())).append("\n");
-        if (containsFontFormattingBlock()) {
-            buffer.append(_fontFormatting).append("\n");
-        }
-        if (containsBorderFormattingBlock()) {
-            buffer.append(_borderFormatting).append("\n");
-        }
-        if (containsPatternFormattingBlock()) {
-            buffer.append(_patternFormatting).append("\n");
-        }
-        buffer.append("    
.dxfn12_ext=").append(HexDump.toHex(ext_formatting_data)).append("\n");
-        buffer.append("    .formula_1 
=").append(Arrays.toString(getFormula1().getTokens())).append("\n");
-        buffer.append("    .formula_2 
=").append(Arrays.toString(getFormula2().getTokens())).append("\n");
-        buffer.append("    .formula_S 
=").append(Arrays.toString(formula_scale.getTokens())).append("\n");
-        buffer.append("    .ext_opts  =").append(ext_opts).append("\n");
-        buffer.append("    .priority  =").append(priority).append("\n");
-        buffer.append("    .template_type  
=").append(template_type).append("\n");
-        buffer.append("    
.template_params=").append(HexDump.toHex(template_params)).append("\n");
-        buffer.append("    .filter_data    
=").append(HexDump.toHex(filter_data)).append("\n");
-        if (color_gradient != null) {
-            buffer.append(color_gradient);
-        }
-        if (multistate != null) {
-            buffer.append(multistate);
-        }
-        if (data_bar != null) {
-            buffer.append(data_bar);
-        }
-        buffer.append("[/CFRULE12]\n");
-        return buffer.toString();
-    }
-
     @Override
     @SuppressWarnings("squid:S2975")
     @Deprecated
@@ -506,4 +471,27 @@ public final class CFRule12Record extend
     public CellRangeAddress getAssociatedRange() {
         return futureHeader.getAssociatedRange();
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CF_RULE_12;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        final Map<String, Supplier<?>> m = new 
LinkedHashMap<>(super.getGenericProperties());
+        m.put("dxFn12Length", () -> ext_formatting_length);
+        m.put("futureHeader", this::getFutureHeader);
+        m.put("dxFn12Ext", () -> ext_formatting_data);
+        m.put("formulaScale", this::getParsedExpressionScale);
+        m.put("extOptions", () -> ext_opts);
+        m.put("priority", this::getPriority);
+        m.put("templateType", () -> template_type);
+        m.put("templateParams", () -> template_params);
+        m.put("filterData",  () -> filter_data);
+        m.put("dataBar", this::getDataBarFormatting);
+        m.put("multiState", this::getMultiStateFormatting);
+        m.put("colorGradient", this::getColorGradientFormatting);
+        return Collections.unmodifiableMap(m);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java Sun Apr 12 
22:03:52 2020
@@ -17,6 +17,9 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.record.cf.BorderFormatting;
 import org.apache.poi.hssf.record.cf.FontFormatting;
@@ -27,6 +30,7 @@ import org.apache.poi.ss.formula.Formula
 import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
@@ -466,4 +470,19 @@ public abstract class CFRuleBase extends
 
     @Override
     public abstract CFRuleBase copy();
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "conditionType", this::getConditionType,
+            "comparisonOperation", this::getComparisonOperation,
+            "formattingOptions", this::getOptions,
+            "formattingNotUsed", () -> formatting_not_used,
+            "fontFormatting", this::getFontFormatting,
+            "borderFormatting", this::getBorderFormatting,
+            "patternFormatting", this::getPatternFormatting,
+            "formula1", this::getFormula1,
+            "formula2", this::getFormula2
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java Sun Apr 12 
22:03:52 2020
@@ -17,8 +17,6 @@
 
 package org.apache.poi.hssf.record;
 
-import java.util.Arrays;
-
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.ss.formula.Formula;
 import org.apache.poi.ss.formula.ptg.Ptg;
@@ -39,15 +37,11 @@ public final class CFRuleRecord extends
         super(other);
     }
 
-    private CFRuleRecord(byte conditionType, byte comparisonOperation) {
-        super(conditionType, comparisonOperation);
-        setDefaults();
-    }
-
     private CFRuleRecord(byte conditionType, byte comparisonOperation, Ptg[] 
formula1, Ptg[] formula2) {
         super(conditionType, comparisonOperation, formula1, formula2);
         setDefaults();
     }
+
     private void setDefaults() {
         // Set modification flags to 1: by default options are not modified
         formatting_options = modificationBits.setValue(formatting_options, -1);
@@ -139,27 +133,6 @@ public final class CFRuleRecord extends
     }
 
     @Override
-    public String toString() {
-        StringBuilder buffer = new StringBuilder();
-        buffer.append("[CFRULE]\n");
-        buffer.append("    .condition_type   
=").append(getConditionType()).append("\n");
-        buffer.append("    OPTION 
FLAGS=0x").append(Integer.toHexString(getOptions())).append("\n");
-        if (containsFontFormattingBlock()) {
-            buffer.append(_fontFormatting).append("\n");
-        }
-        if (containsBorderFormattingBlock()) {
-            buffer.append(_borderFormatting).append("\n");
-        }
-        if (containsPatternFormattingBlock()) {
-            buffer.append(_patternFormatting).append("\n");
-        }
-        buffer.append("    Formula 1 
=").append(Arrays.toString(getFormula1().getTokens())).append("\n");
-        buffer.append("    Formula 2 
=").append(Arrays.toString(getFormula2().getTokens())).append("\n");
-        buffer.append("[/CFRULE]\n");
-        return buffer.toString();
-    }
-
-    @Override
     @SuppressWarnings("squid:S2975")
     @Deprecated
     @Removal(version = "5.0.0")
@@ -171,4 +144,9 @@ public final class CFRuleRecord extends
     public CFRuleRecord copy() {
         return new CFRuleRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CF_RULE;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CRNCountRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CRNCountRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CRNCountRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CRNCountRecord.java Sun Apr 
12 22:03:52 2020
@@ -17,6 +17,10 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 /**
  * XCT - CRN Count
@@ -29,10 +33,6 @@ public final class CRNCountRecord extend
        private int field_1_number_crn_records;
        private int field_2_sheet_table_index;
 
-       private CRNCountRecord() {
-               // incomplete code
-       }
-
        public CRNCountRecord(CRNCountRecord other) {
                super(other);
                field_1_number_crn_records = other.field_1_number_crn_records;
@@ -53,15 +53,6 @@ public final class CRNCountRecord extend
                return field_1_number_crn_records;
        }
 
-       public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(getClass().getName()).append(" [XCT");
-        sb.append(" nCRNs=").append(field_1_number_crn_records);
-        sb.append(" sheetIx=").append(field_2_sheet_table_index);
-        sb.append("]");
-        return sb.toString();
-       }
-
        public void serialize(LittleEndianOutput out) {
                out.writeShort((short)field_1_number_crn_records);
                out.writeShort((short)field_2_sheet_table_index);
@@ -81,4 +72,17 @@ public final class CRNCountRecord extend
        public CRNCountRecord copy() {
                return new CRNCountRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.CRN_COUNT;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "numberOfCRNs", this::getNumberOfCRNs,
+                       "sheetTableIndex", () -> field_2_sheet_table_index
+               );
+       }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CRNRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CRNRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CRNRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CRNRecord.java Sun Apr 12 
22:03:52 2020
@@ -17,7 +17,11 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.ss.formula.constant.ConstantValueParser;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
@@ -31,10 +35,6 @@ public final class CRNRecord extends Sta
        private int     field_3_row_index;
        private Object[] field_4_constant_values;
 
-       private CRNRecord() {
-               // incomplete code
-       }
-
        public CRNRecord(CRNRecord other) {
                super(other);
                field_1_last_column_index = other.field_1_last_column_index;
@@ -57,15 +57,6 @@ public final class CRNRecord extends Sta
                return field_1_last_column_index;
        }
 
-       public String toString() {
-               StringBuilder sb = new StringBuilder();
-               sb.append(getClass().getName()).append(" [CRN");
-               sb.append(" rowIx=").append(field_3_row_index);
-               sb.append(" firstColIx=").append(field_2_first_column_index);
-               sb.append(" lastColIx=").append(field_1_last_column_index);
-               sb.append("]");
-               return sb.toString();
-       }
        protected int getDataSize() {
                return 4 + 
ConstantValueParser.getEncodedSize(field_4_constant_values);
        }
@@ -88,4 +79,19 @@ public final class CRNRecord extends Sta
        public CRNRecord copy() {
                return new CRNRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.CRN;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "row", () -> field_3_row_index,
+                       "firstColumn", () -> field_2_first_column_index,
+                       "lastColumn", () -> field_1_last_column_index,
+                       "constantValues", () -> field_4_constant_values
+               );
+       }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CalcCountRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CalcCountRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CalcCountRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CalcCountRecord.java Sun Apr 
12 22:03:52 2020
@@ -19,6 +19,10 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -69,17 +73,6 @@ public final class CalcCountRecord exten
         return field_1_iterations;
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[CALCCOUNT]\n");
-        buffer.append("    .iterations     = ")
-            .append(Integer.toHexString(getIterations())).append("\n");
-        buffer.append("[/CALCCOUNT]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(getIterations());
     }
@@ -94,7 +87,7 @@ public final class CalcCountRecord exten
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public CalcCountRecord clone() {
@@ -105,4 +98,16 @@ public final class CalcCountRecord exten
     public CalcCountRecord copy() {
         return new CalcCountRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CALC_COUNT;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "iterations", this::getIterations
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CalcModeRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CalcModeRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CalcModeRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CalcModeRecord.java Sun Apr 
12 22:03:52 2020
@@ -19,6 +19,10 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -84,17 +88,6 @@ public final class CalcModeRecord extend
         return field_1_calcmode;
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[CALCMODE]\n");
-        buffer.append("    .calcmode       = ")
-            .append(Integer.toHexString(getCalcMode())).append("\n");
-        buffer.append("[/CALCMODE]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(getCalcMode());
     }
@@ -109,7 +102,7 @@ public final class CalcModeRecord extend
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public CalcModeRecord clone() {
@@ -120,4 +113,16 @@ public final class CalcModeRecord extend
     public CalcModeRecord copy() {
         return new CalcModeRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CALC_MODE;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "calcMode", this::getCalcMode
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CellRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CellRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CellRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CellRecord.java Sun Apr 12 
22:03:52 2020
@@ -17,7 +17,10 @@
 
 package org.apache.poi.hssf.record;
 
-import org.apache.poi.util.HexDump;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
@@ -86,30 +89,6 @@ public abstract class CellRecord extends
         return (short) _formatIndex;
     }
 
-    @Override
-    public final String toString() {
-        StringBuilder sb = new StringBuilder();
-        String recordName = getRecordName();
-
-        sb.append("[").append(recordName).append("]\n");
-        sb.append("    .row    = 
").append(HexDump.shortToHex(getRow())).append("\n");
-        sb.append("    .col    = 
").append(HexDump.shortToHex(getColumn())).append("\n");
-        sb.append("    .xfindex= 
").append(HexDump.shortToHex(getXFIndex())).append("\n");
-        appendValueText(sb);
-        sb.append("\n");
-        sb.append("[/").append(recordName).append("]\n");
-        return sb.toString();
-    }
-
-    /**
-     * Append specific debug info (used by {@link #toString()} for the value
-     * contained in this record. Trailing new-line should not be appended
-     * (superclass does that).
-     *
-     * @param sb the StringBuilder to write to
-     */
-    protected abstract void appendValueText(StringBuilder sb);
-
     /**
      * Gets the debug info BIFF record type name (used by {@link #toString()}.
      *
@@ -144,4 +123,13 @@ public abstract class CellRecord extends
 
     @Override
     public abstract CellRecord copy();
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "row", this::getRow,
+            "col", this::getColumn,
+            "xfIndex", this::getXFIndex
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CodepageRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CodepageRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CodepageRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CodepageRecord.java Sun Apr 
12 22:03:52 2020
@@ -19,7 +19,11 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.util.CodePageUtil;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
@@ -77,17 +81,6 @@ public final class CodepageRecord extend
         return field_1_codepage;
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[CODEPAGE]\n");
-        buffer.append("    .codepage        = ")
-            .append(Integer.toHexString(getCodepage())).append("\n");
-        buffer.append("[/CODEPAGE]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(getCodepage());
     }
@@ -105,4 +98,16 @@ public final class CodepageRecord extend
     public CodepageRecord copy() {
         return new CodepageRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CODEPAGE;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "codepage", this::getCodepage
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java Sun Apr 
12 22:03:52 2020
@@ -17,9 +17,12 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -216,10 +219,7 @@ public final class ColumnInfoRecord exte
         if (_options != other._options) {
             return false;
         }
-        if (_colWidth != other._colWidth) {
-            return false;
-        }
-        return true;
+        return _colWidth == other._colWidth;
     }
 
     public short getSid() {
@@ -239,24 +239,8 @@ public final class ColumnInfoRecord exte
         return 12;
     }
 
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-
-        sb.append("[COLINFO]\n");
-        sb.append("  colfirst = ").append(getFirstColumn()).append("\n");
-        sb.append("  collast  = ").append(getLastColumn()).append("\n");
-        sb.append("  colwidth = ").append(getColumnWidth()).append("\n");
-        sb.append("  xfindex  = ").append(getXFIndex()).append("\n");
-        sb.append("  options  = 
").append(HexDump.shortToHex(_options)).append("\n");
-        sb.append("    hidden   = ").append(getHidden()).append("\n");
-        sb.append("    olevel   = ").append(getOutlineLevel()).append("\n");
-        sb.append("    collapsed= ").append(getCollapsed()).append("\n");
-        sb.append("[/COLINFO]\n");
-        return sb.toString();
-    }
-
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public ColumnInfoRecord clone() {
@@ -267,4 +251,23 @@ public final class ColumnInfoRecord exte
     public ColumnInfoRecord copy() {
         return new ColumnInfoRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.COLUMN_INFO;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "firstColumn", this::getFirstColumn,
+            "lastColumn", this::getLastColumn,
+            "columnWidth", this::getColumnWidth,
+            "xfIndex", this::getXFIndex,
+            "options", () -> _options,
+            "hidden", this::getHidden,
+            "outlineLevel", this::getOutlineLevel,
+            "collapsed", this::getCollapsed
+        );
+    }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java 
(original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,9 +17,14 @@
 
 package org.apache.poi.hssf.record;
 
+import static org.apache.poi.util.GenericRecordUtil.getBitsAsString;
+
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.RecordFormatException;
@@ -89,6 +94,10 @@ public final class CommonObjectDataSubRe
     }
 
     public CommonObjectDataSubRecord(LittleEndianInput in, int size) {
+        this(in, size, -1);
+    }
+
+    CommonObjectDataSubRecord(LittleEndianInput in, int size, int cmoOt) {
         if (size != 18) {
             throw new RecordFormatException("Expected size 18 but got (" + 
size + ")");
         }
@@ -101,45 +110,6 @@ public final class CommonObjectDataSubRe
     }
 
     @Override
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[ftCmo]\n");
-        buffer.append("    .objectType           = ")
-            .append("0x").append(HexDump.toHex(  getObjectType ()))
-            .append(" (").append( getObjectType() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .objectId             = ")
-            .append("0x").append(HexDump.toHex(  getObjectId ()))
-            .append(" (").append( getObjectId() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .option               = ")
-            .append("0x").append(HexDump.toHex(  getOption ()))
-            .append(" (").append( getOption() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("         .locked                   = 
").append(isLocked()).append('\n');
-        buffer.append("         .printable                = 
").append(isPrintable()).append('\n');
-        buffer.append("         .autofill                 = 
").append(isAutofill()).append('\n');
-        buffer.append("         .autoline                 = 
").append(isAutoline()).append('\n');
-        buffer.append("    .reserved1            = ")
-            .append("0x").append(HexDump.toHex(  getReserved1 ()))
-            .append(" (").append( getReserved1() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .reserved2            = ")
-            .append("0x").append(HexDump.toHex(  getReserved2 ()))
-            .append(" (").append( getReserved2() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .reserved3            = ")
-            .append("0x").append(HexDump.toHex(  getReserved3 ()))
-            .append(" (").append( getReserved3() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-
-        buffer.append("[/ftCmo]\n");
-        return buffer.toString();
-    }
-
-    @Override
     public void serialize(LittleEndianOutput out) {
 
         out.writeShort(sid);
@@ -442,4 +412,23 @@ public final class CommonObjectDataSubRe
     {
         return autoline.isSet(field_3_option);
     }
+
+    @Override
+    public SubRecordTypes getGenericRecordType() {
+        return SubRecordTypes.COMMON_OBJECT_DATA;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "objectType", this::getObjectType,
+            "objectId", this::getObjectId,
+            "option", getBitsAsString(this::getOption,
+                new BitField[]{locked,printable,autofill,autoline},
+                new String[]{"LOCKED","PRINTABLE","AUTOFILL","AUTOLINE"}),
+            "reserved1", this::getReserved1,
+            "reserved2", this::getReserved2,
+            "reserved3", this::getReserved3
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/ContinueRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/ContinueRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/ContinueRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/ContinueRecord.java Sun Apr 
12 22:03:52 2020
@@ -17,7 +17,10 @@
 
 package org.apache.poi.hssf.record;
 
-import org.apache.poi.util.HexDump;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -55,15 +58,6 @@ public final class ContinueRecord extend
         return _data;
     }
 
-    public String toString() {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[CONTINUE RECORD]\n");
-        buffer.append("    .data = 
").append(HexDump.toHex(_data)).append("\n");
-        buffer.append("[/CONTINUE RECORD]\n");
-        return buffer.toString();
-    }
-
     public short getSid() {
         return sid;
     }
@@ -73,7 +67,7 @@ public final class ContinueRecord extend
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public ContinueRecord clone() {
@@ -84,4 +78,14 @@ public final class ContinueRecord extend
     public ContinueRecord copy() {
         return new ContinueRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CONTINUE;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties("data", this::getData);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CountryRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CountryRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CountryRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CountryRecord.java Sun Apr 12 
22:03:52 2020
@@ -19,6 +19,10 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
@@ -93,19 +97,6 @@ public final class CountryRecord extends
         return field_2_current_country;
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[COUNTRY]\n");
-        buffer.append("    .defaultcountry  = ")
-            .append(Integer.toHexString(getDefaultCountry())).append("\n");
-        buffer.append("    .currentcountry  = ")
-            .append(Integer.toHexString(getCurrentCountry())).append("\n");
-        buffer.append("[/COUNTRY]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(getDefaultCountry());
         out.writeShort(getCurrentCountry());
@@ -124,4 +115,17 @@ public final class CountryRecord extends
     public CountryRecord copy() {
         return new CountryRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.COUNTRY;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "defaultCountry", this::getDefaultCountry,
+            "currentCountry", this::getCurrentCountry
+        );
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org
For additional commands, e-mail: commits-h...@poi.apache.org

Reply via email to