Modified: poi/trunk/src/java/org/apache/poi/hssf/record/TextObjectRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/TextObjectRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/TextObjectRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/TextObjectRecord.java Sun Apr 
12 22:03:52 2020
@@ -17,6 +17,11 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.function.Supplier;
+
 import org.apache.poi.hssf.record.cont.ContinuableRecord;
 import org.apache.poi.hssf.record.cont.ContinuableRecordOutput;
 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
@@ -24,7 +29,6 @@ import org.apache.poi.ss.formula.ptg.Ope
 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.HexDump;
 import org.apache.poi.util.RecordFormatException;
 import org.apache.poi.util.Removal;
 
@@ -125,11 +129,7 @@ public final class TextObjectRecord exte
                                                + " tokens but expected exactly 
1");
                        }
                        _linkRefPtg = (OperandPtg) ptgs[0];
-                       if (in.remaining() > 0) {
-                               _unknownPostFormulaByte = 
Byte.valueOf(in.readByte());
-                       } else {
-                               _unknownPostFormulaByte = null;
-                       }
+                       _unknownPostFormulaByte = in.remaining() > 0 ? 
in.readByte() : null;
                } else {
                        _linkRefPtg = null;
                }
@@ -195,7 +195,7 @@ public final class TextObjectRecord exte
                        out.writeInt(_unknownPreFormulaInt);
                        _linkRefPtg.write(out);
                        if (_unknownPostFormulaByte != null) {
-                               
out.writeByte(_unknownPostFormulaByte.byteValue());
+                               out.writeByte(_unknownPostFormulaByte);
                        }
                }
        }
@@ -317,33 +317,8 @@ public final class TextObjectRecord exte
                return _linkRefPtg;
        }
 
-       public String toString() {
-               StringBuilder sb = new StringBuilder();
-
-               sb.append("[TXO]\n");
-               sb.append("    .options        = 
").append(HexDump.shortToHex(field_1_options)).append("\n");
-               sb.append("         .isHorizontal = 
").append(getHorizontalTextAlignment()).append('\n');
-               sb.append("         .isVertical   = 
").append(getVerticalTextAlignment()).append('\n');
-               sb.append("         .textLocked   = 
").append(isTextLocked()).append('\n');
-               sb.append("    .textOrientation= 
").append(HexDump.shortToHex(getTextOrientation())).append("\n");
-               sb.append("    .reserved4      = 
").append(HexDump.shortToHex(field_3_reserved4)).append("\n");
-               sb.append("    .reserved5      = 
").append(HexDump.shortToHex(field_4_reserved5)).append("\n");
-               sb.append("    .reserved6      = 
").append(HexDump.shortToHex(field_5_reserved6)).append("\n");
-               sb.append("    .textLength     = 
").append(HexDump.shortToHex(_text.length())).append("\n");
-               sb.append("    .reserved7      = 
").append(HexDump.intToHex(field_8_reserved7)).append("\n");
-
-               sb.append("    .string = ").append(_text).append('\n');
-
-               for (int i = 0; i < _text.numFormattingRuns(); i++) {
-                       sb.append("    .textrun = 
").append(_text.getFontOfFormattingRun(i)).append('\n');
-
-               }
-               sb.append("[/TXO]\n");
-               return sb.toString();
-       }
-
        @Override
-       @SuppressWarnings("squid:S2975")
+       @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
        @Deprecated
        @Removal(version = "5.0.0")
        public TextObjectRecord clone() {
@@ -354,4 +329,24 @@ public final class TextObjectRecord exte
        public TextObjectRecord copy() {
                return new TextObjectRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.TEXT_OBJECT;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               final Map<String,Supplier<?>> m = new LinkedHashMap<>();
+               m.put("isHorizontal", this::getHorizontalTextAlignment);
+               m.put("isVertical", this::getVerticalTextAlignment);
+               m.put("textLocked", this::isTextLocked);
+               m.put("textOrientation", this::getTextOrientation);
+               m.put("string", this::getStr);
+               m.put("reserved4", () -> field_3_reserved4);
+               m.put("reserved5", () -> field_4_reserved5);
+               m.put("reserved6", () -> field_5_reserved6);
+               m.put("reserved7", () -> field_8_reserved7);
+               return Collections.unmodifiableMap(m);
+       }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/TopMarginRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/TopMarginRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/TopMarginRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/TopMarginRecord.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;
 import org.apache.poi.util.Removal;
 
@@ -42,15 +46,6 @@ public final class TopMarginRecord exten
         field_1_margin = in.readDouble();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-        buffer.append( "[TopMargin]\n" );
-        buffer.append( "    .margin               = " ).append( " (" ).append( 
getMargin() ).append( " )\n" );
-        buffer.append( "[/TopMargin]\n" );
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeDouble(field_1_margin);
     }
@@ -73,7 +68,7 @@ public final class TopMarginRecord exten
     {        this.field_1_margin = field_1_margin;    }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public TopMarginRecord clone() {
@@ -84,4 +79,15 @@ public final class TopMarginRecord exten
     public TopMarginRecord copy() {
         return new TopMarginRecord(this);
     }
+
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.TOP_MARGIN;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties("magin", 
this::getMargin);
+    }
 }
\ No newline at end of file

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/UncalcedRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/UncalcedRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/UncalcedRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/UncalcedRecord.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;
 
 /**
@@ -45,14 +49,6 @@ public final class UncalcedRecord extend
                _reserved = in.readShort(); // unused
        }
 
-       public String toString() {
-               StringBuilder buffer = new StringBuilder();
-               buffer.append("[UNCALCED]\n");
-        buffer.append("    _reserved: ").append(_reserved).append('\n');
-               buffer.append("[/UNCALCED]\n");
-               return buffer.toString();
-       }
-
        public void serialize(LittleEndianOutput out) {
                out.writeShort(_reserved);
        }
@@ -69,4 +65,14 @@ public final class UncalcedRecord extend
        public UncalcedRecord copy() {
                return new UncalcedRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.UNCALCED;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties("reserved", () -> 
_reserved);
+       }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java Sun Apr 12 
22:03:52 2020
@@ -18,9 +18,11 @@
 package org.apache.poi.hssf.record;
 
 import java.util.Locale;
+import java.util.Map;
+import java.util.function.Supplier;
 
 import org.apache.poi.hssf.record.aggregates.PageSettingsBlock;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -97,27 +99,6 @@ public final class UnknownRecord extends
     protected int getDataSize() {
         return _rawData.length;
     }
-
-    /**
-     * print a sort of string representation ([UNKNOWN RECORD] id = x 
[/UNKNOWN RECORD])
-     */
-    @Override
-    public String toString() {
-        String biffName = getBiffName(_sid);
-        if (biffName == null) {
-            biffName = "UNKNOWNRECORD";
-        }
-        StringBuilder sb = new StringBuilder();
-
-        sb.append('[').append(biffName).append("] (0x");
-        
sb.append(Integer.toHexString(_sid).toUpperCase(Locale.ROOT)).append(")\n");
-        if (_rawData.length > 0) {
-            sb.append("  
rawData=").append(HexDump.toHex(_rawData)).append("\n");
-        }
-        sb.append("[/").append(biffName).append("]\n");
-        return sb.toString();
-    }
-
     @Override
     public short getSid() {
         return (short) _sid;
@@ -285,7 +266,7 @@ public final class UnknownRecord extends
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public UnknownRecord clone() {
@@ -297,4 +278,23 @@ public final class UnknownRecord extends
         // immutable - OK to return this
         return this;
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.UNKNOWN;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        Supplier<String> biffName = () -> {
+            String bn = getBiffName(_sid);
+            return bn == null ? "UNKNOWNRECORD" : bn;
+        };
+
+        return GenericRecordUtil.getGenericProperties(
+            "sid", this::getSid,
+            "biffName", biffName,
+            "rawData", () -> _rawData
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/UseSelFSRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/UseSelFSRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/UseSelFSRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/UseSelFSRecord.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.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -51,15 +56,6 @@ public final class UseSelFSRecord extend
         _options = useNaturalLanguageFormulasFlag.setBoolean(_options, b);
     }
 
-    public String toString() {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[USESELFS]\n");
-        buffer.append("    .options = 
").append(HexDump.shortToHex(_options)).append("\n");
-        buffer.append("[/USESELFS]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(_options);
     }
@@ -73,7 +69,7 @@ public final class UseSelFSRecord extend
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public UseSelFSRecord clone() {
@@ -84,4 +80,15 @@ public final class UseSelFSRecord extend
     public UseSelFSRecord copy() {
         return new UseSelFSRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.USE_SEL_FS;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties("options", 
getBitsAsString(() -> _options,
+             new BitField[]{useNaturalLanguageFormulasFlag}, new 
String[]{"USE_NATURAL_LANGUAGE_FORMULAS_FLAG"}));
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewBegin.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewBegin.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewBegin.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewBegin.java Sun Apr 
12 22:03:52 2020
@@ -17,9 +17,10 @@
 
 package org.apache.poi.hssf.record;
 
-import java.util.Locale;
+import java.util.Map;
+import java.util.function.Supplier;
 
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -78,18 +79,8 @@ public final class UserSViewBegin extend
         return guid;
     }
 
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-
-        sb.append("[").append("USERSVIEWBEGIN").append("] (0x");
-        
sb.append(Integer.toHexString(sid).toUpperCase(Locale.ROOT)).append(")\n");
-        sb.append("  rawData=").append(HexDump.toHex(_rawData)).append("\n");
-        sb.append("[/").append("USERSVIEWBEGIN").append("]\n");
-        return sb.toString();
-    }
-
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public UserSViewBegin clone() {
@@ -101,4 +92,16 @@ public final class UserSViewBegin extend
         return new UserSViewBegin(this);
     }
 
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.USER_SVIEW_BEGIN;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "guid", this::getGuid,
+            "rawData", () -> _rawData
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewEnd.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewEnd.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewEnd.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/UserSViewEnd.java Sun Apr 12 
22:03:52 2020
@@ -17,9 +17,10 @@
 
 package org.apache.poi.hssf.record;
 
-import java.util.Locale;
+import java.util.Map;
+import java.util.function.Supplier;
 
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -65,18 +66,8 @@ public final class UserSViewEnd extends
         return sid;
     }
 
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-
-        sb.append('[').append("USERSVIEWEND").append("] (0x");
-        
sb.append(Integer.toHexString(sid).toUpperCase(Locale.ROOT)).append(")\n");
-        sb.append("  rawData=").append(HexDump.toHex(_rawData)).append("\n");
-        sb.append("[/").append("USERSVIEWEND").append("]\n");
-        return sb.toString();
-    }
-
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public UserSViewEnd clone() {
@@ -87,4 +78,14 @@ public final class UserSViewEnd extends
     public UserSViewEnd copy() {
         return new UserSViewEnd(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.USER_SVIEW_END;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties("rawData", () -> 
_rawData);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/VCenterRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/VCenterRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/VCenterRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/VCenterRecord.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;
 import org.apache.poi.util.Removal;
 
@@ -61,17 +65,6 @@ public final class VCenterRecord extends
         return (field_1_vcenter == 1);
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[VCENTER]\n");
-        buffer.append("    .vcenter        = ").append(getVCenter())
-            .append("\n");
-        buffer.append("[/VCENTER]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_vcenter);
     }
@@ -86,7 +79,7 @@ public final class VCenterRecord extends
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public VCenterRecord clone() {
@@ -97,4 +90,15 @@ public final class VCenterRecord extends
     public VCenterRecord copy() {
       return new VCenterRecord(this);
     }
+
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.V_CENTER;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties("vcenter", 
this::getVCenter);
+    }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/VerticalPageBreakRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/VerticalPageBreakRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/VerticalPageBreakRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/VerticalPageBreakRecord.java 
Sun Apr 12 22:03:52 2020
@@ -49,7 +49,7 @@ public final class VerticalPageBreakReco
        }
 
        @Override
-       @SuppressWarnings("squid:S2975")
+       @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
        @Deprecated
        @Removal(version = "5.0.0")
        public VerticalPageBreakRecord clone() {
@@ -60,4 +60,9 @@ public final class VerticalPageBreakReco
        public VerticalPageBreakRecord copy() {
                return new VerticalPageBreakRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.VERTICAL_PAGE_BREAK;
+       }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/WSBoolRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/WSBoolRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/WSBoolRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/WSBoolRecord.java Sun Apr 12 
22:03:52 2020
@@ -17,8 +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.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -276,22 +282,6 @@ public final class WSBoolRecord extends
         return alternateformula.isSet(field_2_wsbool);
     }
 
-    // end bitfields
-    public String toString() {
-        return "[WSBOOL]\n" +
-                "    .wsbool1        = " + Integer.toHexString(getWSBool1()) + 
"\n" +
-                "        .autobreaks = " + getAutobreaks() + "\n" +
-                "        .dialog     = " + getDialog() + "\n" +
-                "        .rowsumsbelw= " + getRowSumsBelow() + "\n" +
-                "        .rowsumsrigt= " + getRowSumsRight() + "\n" +
-                "    .wsbool2        = " + Integer.toHexString(getWSBool2()) + 
"\n" +
-                "        .fittopage  = " + getFitToPage() + "\n" +
-                "        .displayguts= " + getDisplayGuts() + "\n" +
-                "        .alternateex= " + getAlternateExpression() + "\n" +
-                "        .alternatefo= " + getAlternateFormula() + "\n" +
-                "[/WSBOOL]\n";
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeByte(getWSBool2());
         out.writeByte(getWSBool1());
@@ -307,7 +297,7 @@ public final class WSBoolRecord extends
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public WSBoolRecord clone() {
@@ -318,4 +308,21 @@ public final class WSBoolRecord extends
     public WSBoolRecord copy() {
       return new WSBoolRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.WS_BOOL;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "wsbool1", getBitsAsString(this::getWSBool1,
+                new BitField[]{autobreaks, dialog, applystyles, rowsumsbelow, 
rowsumsright},
+                new String[]{"AUTO_BREAKS", "DIALOG", "APPLY_STYLES", 
"ROW_SUMS_BELOW", "ROW_SUMS_RIGHT"}),
+            "wsbool2", getBitsAsString(this::getWSBool2,
+                new BitField[]{fittopage, displayguts, alternateexpression, 
alternateformula},
+                new String[]{"FIT_TO_PAGE", "DISPLAY_GUTS", 
"ALTERNATE_EXPRESSION", "ALTERNATE_FORMULA"})
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/WindowOneRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/WindowOneRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/WindowOneRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/WindowOneRecord.java Sun Apr 
12 22:03:52 2020
@@ -17,8 +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.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
@@ -363,39 +369,6 @@ public final class WindowOneRecord exten
         return field_9_tab_width_ratio;
     }
 
-    public String toString() {
-        return "[WINDOW1]\n" +
-                "    .h_hold          = " +
-                Integer.toHexString(getHorizontalHold()) + "\n" +
-                "    .v_hold          = " +
-                Integer.toHexString(getVerticalHold()) + "\n" +
-                "    .width           = " +
-                Integer.toHexString(getWidth()) + "\n" +
-                "    .height          = " +
-                Integer.toHexString(getHeight()) + "\n" +
-                "    .options         = " +
-                Integer.toHexString(getOptions()) + "\n" +
-                "        .hidden      = " + getHidden() +
-                "\n" +
-                "        .iconic      = " + getIconic() +
-                "\n" +
-                "        .hscroll     = " +
-                getDisplayHorizontalScrollbar() + "\n" +
-                "        .vscroll     = " +
-                getDisplayVerticalScrollbar() + "\n" +
-                "        .tabs        = " + getDisplayTabs() +
-                "\n" +
-                "    .activeSheet     = " +
-                Integer.toHexString(getActiveSheetIndex()) + "\n" +
-                "    .firstVisibleTab    = " +
-                Integer.toHexString(getFirstVisibleTab()) + "\n" +
-                "    .numselectedtabs = " +
-                Integer.toHexString(getNumSelectedTabs()) + "\n" +
-                "    .tabwidthratio   = " +
-                Integer.toHexString(getTabWidthRatio()) + "\n" +
-                "[/WINDOW1]\n";
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(getHorizontalHold());
         out.writeShort(getVerticalHold());
@@ -421,4 +394,25 @@ public final class WindowOneRecord exten
     public WindowOneRecord copy() {
         return new WindowOneRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.WINDOW_ONE;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "horizontalHold", this::getHorizontalHold,
+            "verticalHold", this::getVerticalHold,
+            "width", this::getWidth,
+            "options", getBitsAsString(this::getOptions,
+                new BitField[]{hidden, iconic, reserved, hscroll, vscroll, 
tabs},
+                new String[]{"HIDDEN", "ICONIC", "RESERVED", "HSCROLL", 
"VSCROLL", "TABS"}),
+            "activeSheetIndex", this::getActiveSheetIndex,
+            "firstVisibleTab", this::getFirstVisibleTab,
+            "numSelectedTabs", this::getNumSelectedTabs,
+            "tabWidthRatio", this::getTabWidthRatio
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/WindowProtectRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/WindowProtectRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/WindowProtectRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/WindowProtectRecord.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;
 
@@ -68,15 +71,6 @@ public final class WindowProtectRecord e
         return settingsProtectedFlag.isSet(_options);
     }
 
-    public String toString() {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[WINDOWPROTECT]\n");
-        buffer.append("    .options = 
").append(HexDump.shortToHex(_options)).append("\n");
-        buffer.append("[/WINDOWPROTECT]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(_options);
     }
@@ -91,7 +85,7 @@ public final class WindowProtectRecord e
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public WindowProtectRecord clone() {
@@ -102,4 +96,17 @@ public final class WindowProtectRecord e
     public WindowProtectRecord copy() {
         return new WindowProtectRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.WINDOW_PROTECT;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "options", () -> _options,
+            "protect", this::getProtect
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/WindowTwoRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/WindowTwoRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/WindowTwoRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/WindowTwoRecord.java Sun Apr 
12 22:03:52 2020
@@ -17,8 +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.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -438,30 +442,6 @@ public final class WindowTwoRecord exten
         return field_7_reserved;
     }
 
-    public String toString() {
-        return "[WINDOW2]\n" +
-                "    .options        = " + Integer.toHexString(getOptions()) + 
"\n" +
-                "       .dispformulas= " + getDisplayFormulas() + "\n" +
-                "       .dispgridlins= " + getDisplayGridlines() + "\n" +
-                "       .disprcheadin= " + getDisplayRowColHeadings() + "\n" +
-                "       .freezepanes = " + getFreezePanes() + "\n" +
-                "       .displayzeros= " + getDisplayZeros() + "\n" +
-                "       .defaultheadr= " + getDefaultHeader() + "\n" +
-                "       .arabic      = " + getArabic() + "\n" +
-                "       .displayguts = " + getDisplayGuts() + "\n" +
-                "       .frzpnsnosplt= " + getFreezePanesNoSplit() + "\n" +
-                "       .selected    = " + getSelected() + "\n" +
-                "       .active       = " + isActive() + "\n" +
-                "       .svdinpgbrkpv= " + getSavedInPageBreakPreview() + "\n" 
+
-                "    .toprow         = " + Integer.toHexString(getTopRow()) + 
"\n" +
-                "    .leftcol        = " + Integer.toHexString(getLeftCol()) + 
"\n" +
-                "    .headercolor    = " + 
Integer.toHexString(getHeaderColor()) + "\n" +
-                "    .pagebreakzoom  = " + 
Integer.toHexString(getPageBreakZoom()) + "\n" +
-                "    .normalzoom     = " + 
Integer.toHexString(getNormalZoom()) + "\n" +
-                "    .reserved       = " + Integer.toHexString(getReserved()) 
+ "\n" +
-                "[/WINDOW2]\n";
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(getOptions());
         out.writeShort(getTopRow());
@@ -482,7 +462,7 @@ public final class WindowTwoRecord exten
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public WindowTwoRecord clone() {
@@ -493,4 +473,24 @@ public final class WindowTwoRecord exten
     public WindowTwoRecord copy() {
         return new WindowTwoRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.WINDOW_TWO;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "options", GenericRecordUtil.getBitsAsString(this::getOptions,
+                new BitField[]{displayFormulas, displayGridlines, 
displayRowColHeadings, freezePanes, displayZeros, defaultHeader, arabic, 
displayGuts, freezePanesNoSplit, selected, active, savedInPageBreakPreview},
+                new String[]{"DISPLAY_FORMULAS", "DISPLAY_GRIDLINES", 
"DISPLAY_ROW_COL_HEADINGS", "FREEZE_PANES", "DISPLAY_ZEROS", "DEFAULT_HEADER", 
"ARABIC", "DISPLAY_GUTS", "FREEZE_PANES_NO_SPLIT", "SELECTED", "ACTIVE", 
"SAVED_IN_PAGE_BREAK_PREVIEW"}),
+            "topRow", this::getTopRow,
+            "leftCol", this::getLeftCol,
+            "headerColor", this::getHeaderColor,
+            "pageBreakZoom", this::getPageBreakZoom,
+            "normalZoom", this::getNormalZoom,
+            "reserved", this::getReserved
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/WriteAccessRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/WriteAccessRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/WriteAccessRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/WriteAccessRecord.java Sun 
Apr 12 22:03:52 2020
@@ -18,7 +18,10 @@
 package org.apache.poi.hssf.record;
 
 import java.util.Arrays;
+import java.util.Map;
+import java.util.function.Supplier;
 
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.RecordFormatException;
@@ -121,15 +124,6 @@ public final class WriteAccessRecord ext
                return field_1_username;
        }
 
-       public String toString() {
-               StringBuilder buffer = new StringBuilder();
-
-               buffer.append("[WRITEACCESS]\n");
-               buffer.append("    .name = 
").append(field_1_username).append("\n");
-               buffer.append("[/WRITEACCESS]\n");
-               return buffer.toString();
-       }
-
        public void serialize(LittleEndianOutput out) {
                String username = getUsername();
                boolean is16bit = StringUtil.hasMultibyte(username);
@@ -158,4 +152,14 @@ public final class WriteAccessRecord ext
        public WriteAccessRecord copy() {
                return new WriteAccessRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.WRITE_ACCESS;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties("username", 
this::getUsername);
+       }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/WriteProtectRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/WriteProtectRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/WriteProtectRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/WriteProtectRecord.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.util.LittleEndianOutput;
 
 /**
@@ -39,15 +42,6 @@ public final class WriteProtectRecord ex
         }
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[WRITEPROTECT]\n");
-        buffer.append("[/WRITEPROTECT]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
     }
 
@@ -64,4 +58,14 @@ public final class WriteProtectRecord ex
     public WriteProtectRecord copy() {
         return new WriteProtectRecord();
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.WRITE_PROTECT;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return null;
+    }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaFormatRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaFormatRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaFormatRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaFormatRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,11 +17,16 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.HexDump;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -63,42 +68,6 @@ public final class AreaFormatRecord exte
         field_6_backcolorIndex         = other.field_6_backcolorIndex;
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[AREAFORMAT]\n");
-        buffer.append("    .foregroundColor      = ")
-            .append("0x").append(HexDump.toHex(  getForegroundColor ()))
-            .append(" (").append( getForegroundColor() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .backgroundColor      = ")
-            .append("0x").append(HexDump.toHex(  getBackgroundColor ()))
-            .append(" (").append( getBackgroundColor() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .pattern              = ")
-            .append("0x").append(HexDump.toHex(  getPattern ()))
-            .append(" (").append( getPattern() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .formatFlags          = ")
-            .append("0x").append(HexDump.toHex(  getFormatFlags ()))
-            .append(" (").append( getFormatFlags() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("         .automatic                = 
").append(isAutomatic()).append('\n');
-        buffer.append("         .invert                   = 
").append(isInvert()).append('\n');
-        buffer.append("    .forecolorIndex       = ")
-            .append("0x").append(HexDump.toHex(  getForecolorIndex ()))
-            .append(" (").append( getForecolorIndex() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .backcolorIndex       = ")
-            .append("0x").append(HexDump.toHex(  getBackcolorIndex ()))
-            .append(" (").append( getBackcolorIndex() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-
-        buffer.append("[/AREAFORMAT]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeInt(field_1_foregroundColor);
         out.writeInt(field_2_backgroundColor);
@@ -118,7 +87,7 @@ public final class AreaFormatRecord exte
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public AreaFormatRecord clone() {
@@ -261,4 +230,23 @@ public final class AreaFormatRecord exte
     public AreaFormatRecord copy() {
         return new AreaFormatRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.AREA_FORMAT;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        final Map<String,Supplier<?>> m = new LinkedHashMap<>();
+        m.put("foregroundColor", this::getForegroundColor);
+        m.put("backgroundColor", this::getBackgroundColor);
+        m.put("pattern", this::getPattern);
+        m.put("inverted", this::isInvert);
+        m.put("automatic", this::isAutomatic);
+        m.put("formatFlags", this::getFormatFlags);
+        m.put("forecolorIndex", this::getForecolorIndex);
+        m.put("backcolorIndex", this::getBackcolorIndex);
+        return Collections.unmodifiableMap(m);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/AreaRecord.java Sun Apr 
12 22:03:52 2020
@@ -17,11 +17,15 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
 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;
 
@@ -48,23 +52,6 @@ public final class AreaRecord extends St
         field_1_formatFlags            = in.readShort();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[AREA]\n");
-        buffer.append("    .formatFlags          = ")
-            .append("0x").append(HexDump.toHex(  getFormatFlags ()))
-            .append(" (").append( getFormatFlags() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("         .stacked                  = 
").append(isStacked()).append('\n');
-        buffer.append("         .displayAsPercentage      = 
").append(isDisplayAsPercentage()).append('\n');
-        buffer.append("         .shadow                   = 
").append(isShadow()).append('\n');
-
-        buffer.append("[/AREA]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_formatFlags);
     }
@@ -79,7 +66,7 @@ public final class AreaRecord extends St
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public AreaRecord clone() {
@@ -160,4 +147,19 @@ public final class AreaRecord extends St
     public AreaRecord copy() {
         return new AreaRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.AREA;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "formatFlags", this::getFormatFlags,
+            "stacked", this::isStacked,
+            "displayAsPercentage", this::isDisplayAsPercentage,
+            "shadow", this::isShadow
+        );
+    }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisLineFormatRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisLineFormatRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisLineFormatRecord.java 
(original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisLineFormatRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -46,20 +50,6 @@ public final class AxisLineFormatRecord
         field_1_axisType = in.readShort();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[AXISLINEFORMAT]\n");
-        buffer.append("    .axisType             = ")
-            .append("0x").append(HexDump.toHex(  getAxisType ()))
-            .append(" (").append( getAxisType() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-
-        buffer.append("[/AXISLINEFORMAT]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_axisType);
     }
@@ -74,7 +64,7 @@ public final class AxisLineFormatRecord
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public AxisLineFormatRecord clone() {
@@ -114,4 +104,16 @@ public final class AxisLineFormatRecord
     public AxisLineFormatRecord copy() {
         return new AxisLineFormatRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.AXIS_LINE_FORMAT;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "axisType", this::getAxisType
+        );
+    }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisOptionsRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisOptionsRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisOptionsRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisOptionsRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,11 +17,17 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import static org.apache.poi.util.GenericRecordUtil.getBitsAsString;
+
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
 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;
 
@@ -40,6 +46,12 @@ public final class AxisOptionsRecord ext
     private static final BitField defaultCross        = 
BitFieldFactory.getInstance(0x40);
     private static final BitField defaultDateSettings = 
BitFieldFactory.getInstance(0x80);
 
+    private static final int[] FLAG_MASKS = { 
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
+
+    private static final String[] FLAG_NAMES = { "DEFAULT_MINIMUM", 
"DEFAULT_MAXIMUM", "DEFAULT_MAJOR",
+        "DEFAULT_MINOR_UNIT", "IS_DATE", "DEFAULT_BASE", "DEFAULT_CROSS", 
"DEFAULT_DATE_SETTINGS" };
+
+
     private short field_1_minimumCategory;
     private short field_2_maximumCategory;
     private short field_3_majorUnitValue;
@@ -79,60 +91,6 @@ public final class AxisOptionsRecord ext
         field_9_options         = in.readShort();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[AXCEXT]\n");
-        buffer.append("    .minimumCategory      = ")
-            .append("0x").append(HexDump.toHex(  getMinimumCategory ()))
-            .append(" (").append( getMinimumCategory() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .maximumCategory      = ")
-            .append("0x").append(HexDump.toHex(  getMaximumCategory ()))
-            .append(" (").append( getMaximumCategory() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .majorUnitValue       = ")
-            .append("0x").append(HexDump.toHex(  getMajorUnitValue ()))
-            .append(" (").append( getMajorUnitValue() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .majorUnit            = ")
-            .append("0x").append(HexDump.toHex(  getMajorUnit ()))
-            .append(" (").append( getMajorUnit() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .minorUnitValue       = ")
-            .append("0x").append(HexDump.toHex(  getMinorUnitValue ()))
-            .append(" (").append( getMinorUnitValue() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .minorUnit            = ")
-            .append("0x").append(HexDump.toHex(  getMinorUnit ()))
-            .append(" (").append( getMinorUnit() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .baseUnit             = ")
-            .append("0x").append(HexDump.toHex(  getBaseUnit ()))
-            .append(" (").append( getBaseUnit() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .crossingPoint        = ")
-            .append("0x").append(HexDump.toHex(  getCrossingPoint ()))
-            .append(" (").append( getCrossingPoint() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .options              = ")
-            .append("0x").append(HexDump.toHex(  getOptions ()))
-            .append(" (").append( getOptions() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("         .defaultMinimum           = 
").append(isDefaultMinimum()).append('\n');
-        buffer.append("         .defaultMaximum           = 
").append(isDefaultMaximum()).append('\n');
-        buffer.append("         .defaultMajor             = 
").append(isDefaultMajor()).append('\n');
-        buffer.append("         .defaultMinorUnit         = 
").append(isDefaultMinorUnit()).append('\n');
-        buffer.append("         .isDate                   = 
").append(isIsDate()).append('\n');
-        buffer.append("         .defaultBase              = 
").append(isDefaultBase()).append('\n');
-        buffer.append("         .defaultCross             = 
").append(isDefaultCross()).append('\n');
-        buffer.append("         .defaultDateSettings      = 
").append(isDefaultDateSettings()).append('\n');
-
-        buffer.append("[/AXCEXT]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_minimumCategory);
         out.writeShort(field_2_maximumCategory);
@@ -155,7 +113,7 @@ public final class AxisOptionsRecord ext
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public AxisOptionsRecord clone() {
@@ -454,4 +412,24 @@ public final class AxisOptionsRecord ext
     public AxisOptionsRecord copy() {
         return new AxisOptionsRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.AXIS_OPTIONS;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "minimumCategory", this::getMinimumCategory,
+            "maximumCategory", this::getMaximumCategory,
+            "majorUnitValue", this::getMajorUnitValue,
+            "majorUnit", this::getMajorUnit,
+            "minorUnitValue", this::getMinorUnitValue,
+            "minorUnit", this::getMinorUnit,
+            "baseUnit", this::getBaseUnit,
+            "crossingPoint", this::getCrossingPoint,
+            "options", getBitsAsString(this::getOptions, FLAG_MASKS, 
FLAG_NAMES)
+        );
+    }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisParentRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisParentRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisParentRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisParentRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -58,36 +62,6 @@ public final class AxisParentRecord exte
         field_5_height   = in.readInt();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[AXISPARENT]\n");
-        buffer.append("    .axisType             = ")
-            .append("0x").append(HexDump.toHex(  getAxisType ()))
-            .append(" (").append( getAxisType() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .x                    = ")
-            .append("0x").append(HexDump.toHex(  getX ()))
-            .append(" (").append( getX() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .y                    = ")
-            .append("0x").append(HexDump.toHex(  getY ()))
-            .append(" (").append( getY() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .width                = ")
-            .append("0x").append(HexDump.toHex(  getWidth ()))
-            .append(" (").append( getWidth() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .height               = ")
-            .append("0x").append(HexDump.toHex(  getHeight ()))
-            .append(" (").append( getHeight() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-
-        buffer.append("[/AXISPARENT]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_axisType);
         out.writeInt(field_2_x);
@@ -106,7 +80,7 @@ public final class AxisParentRecord exte
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public AxisParentRecord clone() {
@@ -206,4 +180,20 @@ public final class AxisParentRecord exte
     public AxisParentRecord copy() {
         return new AxisParentRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.AXIS_PARENT;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "axisType", this::getAxisType,
+            "x", this::getX,
+            "y", this::getY,
+            "width", this::getWidth,
+            "height", this::getHeight
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisRecord.java Sun Apr 
12 22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -57,36 +61,6 @@ public final class AxisRecord extends St
         field_5_reserved4 = in.readInt();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[AXIS]\n");
-        buffer.append("    .axisType             = ")
-            .append("0x").append(HexDump.toHex(  getAxisType ()))
-            .append(" (").append( getAxisType() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        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("    .reserved4            = ")
-            .append("0x").append(HexDump.toHex(  getReserved4 ()))
-            .append(" (").append( getReserved4() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-
-        buffer.append("[/AXIS]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_axisType);
         out.writeInt(field_2_reserved1);
@@ -105,7 +79,7 @@ public final class AxisRecord extends St
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public AxisRecord clone() {
@@ -207,4 +181,20 @@ public final class AxisRecord extends St
     public AxisRecord copy() {
         return new AxisRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.AXIS;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "axisType", this::getAxisType,
+            "reserved1", this::getReserved1,
+            "reserved2", this::getReserved2,
+            "reserved3", this::getReserved3,
+            "reserved4", this::getReserved4
+        );
+    }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisUsedRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisUsedRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisUsedRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/AxisUsedRecord.java Sun 
Apr 12 22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -42,20 +46,6 @@ public final class AxisUsedRecord extend
         field_1_numAxis = in.readShort();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[AXISUSED]\n");
-        buffer.append("    .numAxis              = ")
-            .append("0x").append(HexDump.toHex(  getNumAxis ()))
-            .append(" (").append( getNumAxis() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-
-        buffer.append("[/AXISUSED]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_numAxis);
     }
@@ -70,7 +60,7 @@ public final class AxisUsedRecord extend
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public AxisUsedRecord clone() {
@@ -97,4 +87,16 @@ public final class AxisUsedRecord extend
     public AxisUsedRecord copy() {
         return new AxisUsedRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.AXIS_USED;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "numAxis", this::getNumAxis
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/chart/BarRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/BarRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/BarRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/BarRecord.java Sun Apr 
12 22:03:52 2020
@@ -17,11 +17,16 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.HexDump;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -56,32 +61,6 @@ public final class BarRecord extends Sta
         field_3_formatFlags   = in.readShort();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[BAR]\n");
-        buffer.append("    .barSpace             = ")
-            .append("0x").append(HexDump.toHex(  getBarSpace ()))
-            .append(" (").append( getBarSpace() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .categorySpace        = ")
-            .append("0x").append(HexDump.toHex(  getCategorySpace ()))
-            .append(" (").append( getCategorySpace() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .formatFlags          = ")
-            .append("0x").append(HexDump.toHex(  getFormatFlags ()))
-            .append(" (").append( getFormatFlags() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("         .horizontal               = 
").append(isHorizontal()).append('\n');
-        buffer.append("         .stacked                  = 
").append(isStacked()).append('\n');
-        buffer.append("         .displayAsPercentage      = 
").append(isDisplayAsPercentage()).append('\n');
-        buffer.append("         .shadow                   = 
").append(isShadow()).append('\n');
-
-        buffer.append("[/BAR]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_barSpace);
         out.writeShort(field_2_categorySpace);
@@ -98,7 +77,7 @@ public final class BarRecord extends Sta
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public BarRecord clone() {
@@ -229,4 +208,23 @@ public final class BarRecord extends Sta
     public BarRecord copy() {
         return new BarRecord(this);
     }
+
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.BAR;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        final Map<String,Supplier<?>> m = new LinkedHashMap<>();
+        m.put("barSpace", this::getBarSpace);
+        m.put("categorySpace", this::getCategorySpace);
+        m.put("formatFlags", this::getFormatFlags);
+        m.put("horizontal", this::isHorizontal);
+        m.put("stacked", this::isStacked);
+        m.put("displayAsPercentage", this::isDisplayAsPercentage);
+        m.put("shadow", this::isShadow);
+        return Collections.unmodifiableMap(m);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/chart/BeginRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/BeginRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/BeginRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/BeginRecord.java Sun 
Apr 12 22:03:52 2020
@@ -17,6 +17,10 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
 import org.apache.poi.util.LittleEndianOutput;
@@ -42,15 +46,6 @@ public final class BeginRecord extends S
      */
     public BeginRecord(RecordInputStream in) {}
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[BEGIN]\n");
-        buffer.append("[/BEGIN]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
     }
 
@@ -64,7 +59,7 @@ public final class BeginRecord extends S
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public BeginRecord clone() {
@@ -75,4 +70,14 @@ public final class BeginRecord extends S
     public BeginRecord copy() {
         return new BeginRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.BEGIN;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return null;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/chart/CatLabRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/CatLabRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/CatLabRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/CatLabRecord.java Sun 
Apr 12 22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
@@ -82,24 +86,24 @@ public final class CatLabRecord extends
        }
 
        @Override
-       public String toString() {
-               StringBuilder buffer = new StringBuilder();
-
-               buffer.append("[CATLAB]\n");
-               buffer.append("    .rt      
=").append(HexDump.shortToHex(rt)).append('\n');
-               buffer.append("    
.grbitFrt=").append(HexDump.shortToHex(grbitFrt)).append('\n');
-               buffer.append("    .wOffset 
=").append(HexDump.shortToHex(wOffset)).append('\n');
-               buffer.append("    .at      
=").append(HexDump.shortToHex(at)).append('\n');
-               buffer.append("    .grbit   
=").append(HexDump.shortToHex(grbit)).append('\n');
-               if(unused != null)
-                       buffer.append("    .unused  
=").append(HexDump.shortToHex(unused)).append('\n');
+       public CatLabRecord copy() {
+               return new CatLabRecord(this);
+       }
 
-               buffer.append("[/CATLAB]\n");
-               return buffer.toString();
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.CAT_LAB;
        }
 
        @Override
-       public CatLabRecord copy() {
-               return new CatLabRecord(this);
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "rt", () -> rt,
+                       "grbitFrt", () -> grbitFrt,
+                       "wOffset", () -> wOffset,
+                       "at", () -> at,
+                       "grbit", () -> grbit,
+                       "unused", () -> unused
+               );
        }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/CategorySeriesAxisRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/CategorySeriesAxisRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/CategorySeriesAxisRecord.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/CategorySeriesAxisRecord.java
 Sun Apr 12 22:03:52 2020
@@ -17,11 +17,15 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
 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;
 
@@ -58,35 +62,6 @@ public final class CategorySeriesAxisRec
         field_4_options           = in.readShort();
     }
 
-    public String toString()
-    {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[CATSERRANGE]\n");
-        buffer.append("    .crossingPoint        = ")
-            .append("0x").append(HexDump.toHex(  getCrossingPoint ()))
-            .append(" (").append( getCrossingPoint() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .labelFrequency       = ")
-            .append("0x").append(HexDump.toHex(  getLabelFrequency ()))
-            .append(" (").append( getLabelFrequency() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .tickMarkFrequency    = ")
-            .append("0x").append(HexDump.toHex(  getTickMarkFrequency ()))
-            .append(" (").append( getTickMarkFrequency() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("    .options              = ")
-            .append("0x").append(HexDump.toHex(  getOptions ()))
-            .append(" (").append( getOptions() ).append(" )");
-        buffer.append(System.getProperty("line.separator"));
-        buffer.append("         .valueAxisCrossing        = 
").append(isValueAxisCrossing()).append('\n');
-        buffer.append("         .crossesFarRight          = 
").append(isCrossesFarRight()).append('\n');
-        buffer.append("         .reversed                 = 
").append(isReversed()).append('\n');
-
-        buffer.append("[/CATSERRANGE]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeShort(field_1_crossingPoint);
         out.writeShort(field_2_labelFrequency);
@@ -104,7 +79,7 @@ public final class CategorySeriesAxisRec
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public CategorySeriesAxisRecord clone() {
@@ -233,4 +208,22 @@ public final class CategorySeriesAxisRec
     public CategorySeriesAxisRecord copy() {
         return new CategorySeriesAxisRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CATEGORY_SERIES_AXIS;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "crossingPoint", this::getCrossingPoint,
+            "labelFrequency", this::getLabelFrequency,
+            "tickMarkFrequency", this::getTickMarkFrequency,
+            "options", this::getOptions,
+            "valueAxisCrossing", this::isValueAxisCrossing,
+            "crossesFarRight", this::isCrossesFarRight,
+            "reversed", this::isReversed
+        );
+    }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndBlockRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndBlockRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndBlockRecord.java 
(original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndBlockRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -78,20 +82,7 @@ public final class ChartEndBlockRecord e
        }
 
        @Override
-       public String toString() {
-               StringBuilder buffer = new StringBuilder();
-
-               buffer.append("[ENDBLOCK]\n");
-               buffer.append("    .rt         
=").append(HexDump.shortToHex(rt)).append('\n');
-               buffer.append("    .grbitFrt   
=").append(HexDump.shortToHex(grbitFrt)).append('\n');
-               buffer.append("    
.iObjectKind=").append(HexDump.shortToHex(iObjectKind)).append('\n');
-               buffer.append("    .unused     
=").append(HexDump.toHex(unused)).append('\n');
-               buffer.append("[/ENDBLOCK]\n");
-               return buffer.toString();
-       }
-
-       @Override
-       @SuppressWarnings("squid:S2975")
+       @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
        @Deprecated
        @Removal(version = "5.0.0")
        public ChartEndBlockRecord clone() {
@@ -102,4 +93,19 @@ public final class ChartEndBlockRecord e
        public ChartEndBlockRecord copy() {
                return new ChartEndBlockRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.CHART_END_BLOCK;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "rt", () -> rt,
+                       "grbitFrt", () -> grbitFrt,
+                       "iObjectKind", () -> iObjectKind,
+                       "unused", () -> unused
+               );
+       }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java 
(original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
@@ -78,20 +82,22 @@ public final class ChartEndObjectRecord
        }
 
        @Override
-       public String toString() {
-               StringBuilder buffer = new StringBuilder();
+       public ChartEndObjectRecord copy() {
+               return new ChartEndObjectRecord(this);
+       }
 
-               buffer.append("[ENDOBJECT]\n");
-               buffer.append("    .rt         
=").append(HexDump.shortToHex(rt)).append('\n');
-               buffer.append("    .grbitFrt   
=").append(HexDump.shortToHex(grbitFrt)).append('\n');
-               buffer.append("    
.iObjectKind=").append(HexDump.shortToHex(iObjectKind)).append('\n');
-               buffer.append("    .reserved   
=").append(HexDump.toHex(reserved)).append('\n');
-               buffer.append("[/ENDOBJECT]\n");
-               return buffer.toString();
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.CHART_END_OBJECT;
        }
 
        @Override
-       public ChartEndObjectRecord copy() {
-               return new ChartEndObjectRecord(this);
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "rt", () -> rt,
+                       "grbitFrt", () -> grbitFrt,
+                       "iObjectKind", () -> iObjectKind,
+                       "reserved", () -> reserved
+               );
        }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFRTInfoRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFRTInfoRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFRTInfoRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFRTInfoRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,11 +17,14 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
 import java.util.stream.Stream;
 
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
@@ -107,21 +110,23 @@ public final class ChartFRTInfoRecord ex
        }
 
        @Override
-       public String toString() {
-               StringBuilder buffer = new StringBuilder();
+       public ChartFRTInfoRecord copy() {
+               return new ChartFRTInfoRecord(this);
+       }
 
-               buffer.append("[CHARTFRTINFO]\n");
-               buffer.append("    .rt           
=").append(HexDump.shortToHex(rt)).append('\n');
-               buffer.append("    .grbitFrt     
=").append(HexDump.shortToHex(grbitFrt)).append('\n');
-               buffer.append("    
.verOriginator=").append(HexDump.byteToHex(verOriginator)).append('\n');
-               buffer.append("    .verWriter    
=").append(HexDump.byteToHex(verOriginator)).append('\n');
-               buffer.append("    .nCFRTIDs     
=").append(HexDump.shortToHex(rgCFRTID.length)).append('\n');
-               buffer.append("[/CHARTFRTINFO]\n");
-               return buffer.toString();
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.CHART_FRT_INFO;
        }
 
        @Override
-       public ChartFRTInfoRecord copy() {
-               return new ChartFRTInfoRecord(this);
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "rt", () -> rt,
+                       "grbitFrt", () -> grbitFrt,
+                       "verOriginator", () -> verOriginator,
+                       "verWriter", () -> verWriter,
+                       "rgCFRTIDs", () -> rgCFRTID
+               );
        }
-}
+}
\ No newline at end of file

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFormatRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFormatRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFormatRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartFormatRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,11 +17,15 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
 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;
 
 /**
@@ -65,19 +69,6 @@ public final class ChartFormatRecord ext
         field6_unknown = in.readUShort();
     }
 
-    public String toString() {
-        StringBuilder buffer = new StringBuilder();
-
-        buffer.append("[CHARTFORMAT]\n");
-        buffer.append("    .xPosition       = 
").append(getXPosition()).append("\n");
-        buffer.append("    .yPosition       = 
").append(getYPosition()).append("\n");
-        buffer.append("    .width           = 
").append(getWidth()).append("\n");
-        buffer.append("    .height          = 
").append(getHeight()).append("\n");
-        buffer.append("    .grBit           = 
").append(HexDump.intToHex(field5_grbit)).append("\n");
-        buffer.append("[/CHARTFORMAT]\n");
-        return buffer.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeInt(getXPosition());
         out.writeInt(getYPosition());
@@ -139,4 +130,22 @@ public final class ChartFormatRecord ext
     public ChartFormatRecord copy() {
         return new ChartFormatRecord(this);
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CHART_FORMAT;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "x", this::getXPosition,
+            "y", this::getYPosition,
+            "width", this::getWidth,
+            "height", this::getHeight,
+            "grbit", () -> field5_grbit,
+            "varyDisplayPattern", this::getVaryDisplayPattern,
+            "unknown", () -> field6_unknown
+        );
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartRecord.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartRecord.java Sun 
Apr 12 22:03:52 2020
@@ -17,8 +17,13 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -63,18 +68,6 @@ public final class ChartRecord extends S
         field_4_height = in.readInt();
     }
 
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-
-        sb.append("[CHART]\n");
-        sb.append("    .x     = ").append(getX()).append('\n');
-        sb.append("    .y     = ").append(getY()).append('\n');
-        sb.append("    .width = ").append(getWidth()).append('\n');
-        sb.append("    .height= ").append(getHeight()).append('\n');
-        sb.append("[/CHART]\n");
-        return sb.toString();
-    }
-
     public void serialize(LittleEndianOutput out) {
         out.writeInt(field_1_x);
         out.writeInt(field_2_y);
@@ -92,7 +85,7 @@ public final class ChartRecord extends S
     }
 
     @Override
-    @SuppressWarnings("squid:S2975")
+    @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
     @Deprecated
     @Removal(version = "5.0.0")
     public ChartRecord clone() {
@@ -159,4 +152,19 @@ public final class ChartRecord extends S
     public void setHeight(int height) {
         field_4_height = height;
     }
+
+    @Override
+    public HSSFRecordTypes getGenericRecordType() {
+        return HSSFRecordTypes.CHART;
+    }
+
+    @Override
+    public Map<String, Supplier<?>> getGenericProperties() {
+        return GenericRecordUtil.getGenericProperties(
+            "x", this::getX,
+            "y", this::getY,
+            "width", this::getWidth,
+            "height", this::getHeight
+        );
+    }
 }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartStartBlockRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartStartBlockRecord.java?rev=1876433&r1=1876432&r2=1876433&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartStartBlockRecord.java 
(original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/chart/ChartStartBlockRecord.java 
Sun Apr 12 22:03:52 2020
@@ -17,9 +17,13 @@
 
 package org.apache.poi.hssf.record.chart;
 
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.poi.hssf.record.HSSFRecordTypes;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.StandardRecord;
-import org.apache.poi.util.HexDump;
+import org.apache.poi.util.GenericRecordUtil;
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.Removal;
 
@@ -77,23 +81,8 @@ public final class ChartStartBlockRecord
                out.writeShort(iObjectInstance2);
        }
 
-       public String toString() {
-
-               StringBuilder buffer = new StringBuilder();
-
-               buffer.append("[STARTBLOCK]\n");
-               buffer.append("    .rt              
=").append(HexDump.shortToHex(rt)).append('\n');
-               buffer.append("    .grbitFrt        
=").append(HexDump.shortToHex(grbitFrt)).append('\n');
-               buffer.append("    .iObjectKind     
=").append(HexDump.shortToHex(iObjectKind)).append('\n');
-               buffer.append("    .iObjectContext  
=").append(HexDump.shortToHex(iObjectContext)).append('\n');
-               buffer.append("    
.iObjectInstance1=").append(HexDump.shortToHex(iObjectInstance1)).append('\n');
-               buffer.append("    
.iObjectInstance2=").append(HexDump.shortToHex(iObjectInstance2)).append('\n');
-               buffer.append("[/STARTBLOCK]\n");
-               return buffer.toString();
-       }
-
        @Override
-       @SuppressWarnings("squid:S2975")
+       @SuppressWarnings({"squid:S2975", "MethodDoesntCallSuperMethod"})
        @Deprecated
        @Removal(version = "5.0.0")
        public ChartStartBlockRecord clone() {
@@ -104,4 +93,21 @@ public final class ChartStartBlockRecord
        public ChartStartBlockRecord copy() {
                return new ChartStartBlockRecord(this);
        }
+
+       @Override
+       public HSSFRecordTypes getGenericRecordType() {
+               return HSSFRecordTypes.CHART_START_BLOCK;
+       }
+
+       @Override
+       public Map<String, Supplier<?>> getGenericProperties() {
+               return GenericRecordUtil.getGenericProperties(
+                       "rt", () -> rt,
+                       "grbitFrt", () -> grbitFrt,
+                       "iObjectKind", () -> iObjectKind,
+                       "iObjectContext", () -> iObjectContext,
+                       "iObjectInstance1", () -> iObjectInstance1,
+                       "iObjectInstance2", () -> iObjectInstance2
+               );
+       }
 }



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

Reply via email to