Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FileSharingRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FileSharingRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FileSharingRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FileSharingRecord.java Sun Dec 22 21:44:45 2019 @@ -18,17 +18,16 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; import org.apache.poi.util.StringUtil; /** - * Title: FILESHARING (0x005B) <p> - * Description: stores the encrypted readonly for a workbook (write protect) - * This functionality is accessed from the options dialog box available when performing 'Save As'.<p> - * REFERENCE: PG 314 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) + * Stores the encrypted readonly for a workbook (write protect).<p> + * This functionality is accessed from the options dialog box available when performing 'Save As'. */ -public final class FileSharingRecord extends StandardRecord implements Cloneable { +public final class FileSharingRecord extends StandardRecord { - public final static short sid = 0x005B; + public static final short sid = 0x005B; private short field_1_readonly; private short field_2_password; private byte field_3_username_unicode_options; @@ -36,14 +35,22 @@ public final class FileSharingRecord ext public FileSharingRecord() {} + public FileSharingRecord(FileSharingRecord other) { + super(other); + field_1_readonly = other.field_1_readonly; + field_2_password = other.field_2_password; + field_3_username_unicode_options = other.field_3_username_unicode_options; + field_3_username_value = other.field_3_username_value; + } + public FileSharingRecord(RecordInputStream in) { field_1_readonly = in.readShort(); field_2_password = in.readShort(); - + int nameLen = in.readShort(); - + if(nameLen > 0) { - // TODO - Current examples(3) from junits only have zero length username. + // TODO - Current examples(3) from junits only have zero length username. field_3_username_unicode_options = in.readByte(); field_3_username_value = in.readCompressedUnicode(nameLen); } else { @@ -137,11 +144,15 @@ public final class FileSharingRecord ext } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public FileSharingRecord clone() { - FileSharingRecord clone = new FileSharingRecord(); - clone.setReadOnly(field_1_readonly); - clone.setPassword(field_2_password); - clone.setUsername(field_3_username_value); - return clone; + return copy(); + } + + @Override + public FileSharingRecord copy() { + return new FileSharingRecord(this); } }
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FnGroupCountRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FnGroupCountRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FnGroupCountRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FnGroupCountRecord.java Sun Dec 22 21:44:45 2019 @@ -15,35 +15,32 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndianOutput; /** - * Title: Function Group Count Record<P> - * Description: Number of built in function groups in the current version of the - * Spreadsheet (probably only used on Windoze)<P> - * REFERENCE: PG 315 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * @author Andrew C. Oliver (acoliver at apache dot org) + * umber of built in function groups in the current version of the Spreadsheet (probably only used on Windows) + * * @version 2.0-pre */ - -public final class FnGroupCountRecord - extends StandardRecord -{ - public final static short sid = 0x9c; +public final class FnGroupCountRecord extends StandardRecord { + public static final short sid = 0x9c; /** * suggested default (14 dec) */ - public final static short COUNT = 14; + public static final short COUNT = 14; private short field_1_count; - public FnGroupCountRecord() - { + public FnGroupCountRecord() {} + + public FnGroupCountRecord(FnGroupCountRecord other) { + super(other); + field_1_count = other.field_1_count; } public FnGroupCountRecord(RecordInputStream in) @@ -96,4 +93,9 @@ public final class FnGroupCountRecord { return sid; } + + @Override + public FnGroupCountRecord copy() { + return new FnGroupCountRecord(this); + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FontRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FontRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FontRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FontRecord.java Sun Dec 22 21:44:45 2019 @@ -25,50 +25,68 @@ import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.StringUtil; -/** - * Title: Font Record (0x0031) <p> - * - describes a font in the workbook (index = 0-3,5-infinity - skip 4)<P> - * Description: An element in the Font Table<p> - * REFERENCE: PG 315 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) - */ +/** Describes a font in the workbook */ public final class FontRecord extends StandardRecord { // docs are wrong (0x231 Microsoft Support site article Q184647) - public final static short sid = 0x0031; - public final static short SS_NONE = 0; - public final static short SS_SUPER = 1; - public final static short SS_SUB = 2; - public final static byte U_NONE = 0; - public final static byte U_SINGLE = 1; - public final static byte U_DOUBLE = 2; - public final static byte U_SINGLE_ACCOUNTING = 0x21; - public final static byte U_DOUBLE_ACCOUNTING = 0x22; - // in units of .05 of a point - private short field_1_font_height; - private short field_2_attributes; + public static final short sid = 0x0031; + public static final short SS_NONE = 0; + public static final short SS_SUPER = 1; + public static final short SS_SUB = 2; + public static final byte U_NONE = 0; + public static final byte U_SINGLE = 1; + public static final byte U_DOUBLE = 2; + public static final byte U_SINGLE_ACCOUNTING = 0x21; + public static final byte U_DOUBLE_ACCOUNTING = 0x22; // 0 0x01 - Reserved bit must be 0 - private static final BitField italic = BitFieldFactory.getInstance(0x02); // is this font in italics + // is this font in italics + private static final BitField italic = BitFieldFactory.getInstance(0x02); // 2 0x04 - reserved bit must be 0 - private static final BitField strikeout =BitFieldFactory.getInstance(0x08); // is this font has a line through the center - private static final BitField macoutline = BitFieldFactory.getInstance(0x10); // some weird macintosh thing....but who understands those mac people anyhow - private static final BitField macshadow = BitFieldFactory.getInstance(0x20); // some weird macintosh thing....but who understands those mac people anyhow + // is this font has a line through the center + private static final BitField strikeout = BitFieldFactory.getInstance(0x08); + // some weird macintosh thing....but who understands those mac people anyhow + private static final BitField macoutline = BitFieldFactory.getInstance(0x10); + private static final BitField macshadow = BitFieldFactory.getInstance(0x20); + + // in units of .05 of a point + private short field_1_font_height; + private short field_2_attributes; // 7-6 - reserved bits must be 0 // the rest is unused - private short field_3_color_palette_index; - private short field_4_bold_weight; - private short field_5_super_sub_script; // 00none/01super/02sub - private byte field_6_underline; // 00none/01single/02double/21singleaccounting/22doubleaccounting - private byte field_7_family; // ?? defined by windows api logfont structure? - private byte field_8_charset; // ?? defined by windows api logfont structure? - private byte field_9_zero; // must be 0 + private short field_3_color_palette_index; + private short field_4_bold_weight; + // 00none/01super/02sub + private short field_5_super_sub_script; + // 00none/01single/02double/21singleaccounting/22doubleaccounting + private byte field_6_underline; + // ?? defined by windows api logfont structure? + private byte field_7_family; + // ?? defined by windows api logfont structure? + private byte field_8_charset; + // must be 0 + private byte field_9_zero; /** possibly empty string never <code>null</code> */ - private String field_11_font_name; + private String field_11_font_name; public FontRecord() { } + public FontRecord(FontRecord other) { + super(other); + field_1_font_height = other.field_1_font_height; + field_2_attributes = other.field_2_attributes; + field_3_color_palette_index = other.field_3_color_palette_index; + field_4_bold_weight = other.field_4_bold_weight; + field_5_super_sub_script = other.field_5_super_sub_script; + field_6_underline = other.field_6_underline; + field_7_family = other.field_7_family; + field_8_charset = other.field_8_charset; + field_9_zero = other.field_9_zero; + field_11_font_name = other.field_11_font_name; + } + public FontRecord(RecordInputStream in) { field_1_font_height = in.readShort(); field_2_attributes = in.readShort(); @@ -490,4 +508,9 @@ public final class FontRecord extends St public boolean equals(Object o) { return (o instanceof FontRecord) && sameProperties((FontRecord) o); } + + @Override + public FontRecord copy() { + return new FontRecord(this); + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FooterRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FooterRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FooterRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FooterRecord.java Sun Dec 22 21:44:45 2019 @@ -17,18 +17,22 @@ package org.apache.poi.hssf.record; +import org.apache.poi.util.Removal; + /** - * Title: Footer Record (0x0015)<p> - * Description: Specifies the footer for a sheet<p> - * REFERENCE: PG 317 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) + * Specifies the footer for a sheet */ -public final class FooterRecord extends HeaderFooterBase implements Cloneable { - public final static short sid = 0x0015; +public final class FooterRecord extends HeaderFooterBase { + public static final short sid = 0x0015; public FooterRecord(String text) { super(text); } + public FooterRecord(FooterRecord other) { + super(other); + } + public FooterRecord(RecordInputStream in) { super(in); } @@ -47,7 +51,15 @@ public final class FooterRecord extends } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public FooterRecord clone() { - return new FooterRecord(getText()); + return copy(); + } + + @Override + public FooterRecord copy() { + return new FooterRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FormatRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FormatRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FormatRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FormatRecord.java Sun Dec 22 21:44:45 2019 @@ -22,30 +22,29 @@ import org.apache.poi.util.LittleEndianC import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; +import org.apache.poi.util.Removal; import org.apache.poi.util.StringUtil; /** - * Title: Format Record (0x041E)<p> - * Description: describes a number format -- those goofy strings like $(#,###)<p> - * - * REFERENCE: PG 317 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) + * Describes a number format -- those goofy strings like $(#,###) */ -public final class FormatRecord extends StandardRecord implements Cloneable { +public final class FormatRecord extends StandardRecord { private static final POILogger logger = POILogFactory.getLogger(FormatRecord.class); - public final static short sid = 0x041E; + public static final short sid = 0x041E; private final int field_1_index_code; private final boolean field_3_hasMultibyte; private final String field_4_formatstring; private FormatRecord(FormatRecord other) { + super(other); field_1_index_code = other.field_1_index_code; field_3_hasMultibyte = other.field_3_hasMultibyte; field_4_formatstring = other.field_4_formatstring; } - + public FormatRecord(int indexCode, String fs) { field_1_index_code = indexCode; field_4_formatstring = fs; @@ -114,9 +113,17 @@ public final class FormatRecord extends public short getSid() { return sid; } - + @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public FormatRecord clone() { + return copy(); + } + + @Override + public FormatRecord copy() { return new FormatRecord(this); } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java Sun Dec 22 21:44:45 2019 @@ -18,168 +18,28 @@ package org.apache.poi.hssf.record; import org.apache.poi.ss.formula.Formula; -import org.apache.poi.ss.formula.eval.ErrorEval; import org.apache.poi.ss.formula.ptg.Ptg; import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.util.*; +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; /** * Formula Record (0x0006). - * REFERENCE: PG 317/444 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * @author Andrew C. Oliver (acoliver at apache dot org) - * @author Jason Height (jheight at chariot dot net dot au) */ -public final class FormulaRecord extends CellRecord implements Cloneable { +public final class FormulaRecord extends CellRecord { - public static final short sid = 0x0006; // docs say 406...because of a bug Microsoft support site article #Q184647) - private static int FIXED_SIZE = 14; // double + short + int + // docs say 406...because of a bug Microsoft support site article #Q184647) + public static final short sid = 0x0006; + // double + short + int + private static final int FIXED_SIZE = 14; private static final BitField alwaysCalc = BitFieldFactory.getInstance(0x0001); private static final BitField calcOnLoad = BitFieldFactory.getInstance(0x0002); private static final BitField sharedFormula = BitFieldFactory.getInstance(0x0008); - /** - * Manages the cached formula result values of other types besides numeric. - * Excel encodes the same 8 bytes that would be field_4_value with various NaN - * values that are decoded/encoded by this class. - */ - static final class SpecialCachedValue { - /** deliberately chosen by Excel in order to encode other values within Double NaNs */ - private static final long BIT_MARKER = 0xFFFF000000000000L; - private static final int VARIABLE_DATA_LENGTH = 6; - private static final int DATA_INDEX = 2; - - // FIXME: can these be merged with {@link CellType}? - // are the numbers specific to the HSSF formula record format or just a poor-man's enum? - public static final int STRING = 0; - public static final int BOOLEAN = 1; - public static final int ERROR_CODE = 2; - public static final int EMPTY = 3; - - private final byte[] _variableData; - - private SpecialCachedValue(byte[] data) { - _variableData = data; - } - - public int getTypeCode() { - return _variableData[0]; - } - - /** - * @return <code>null</code> if the double value encoded by <tt>valueLongBits</tt> - * is a normal (non NaN) double value. - */ - public static SpecialCachedValue create(long valueLongBits) { - if ((BIT_MARKER & valueLongBits) != BIT_MARKER) { - return null; - } - - byte[] result = new byte[VARIABLE_DATA_LENGTH]; - long x = valueLongBits; - for (int i=0; i<VARIABLE_DATA_LENGTH; i++) { - result[i] = (byte) x; - x >>= 8; - } - switch (result[0]) { - case STRING: - case BOOLEAN: - case ERROR_CODE: - case EMPTY: - break; - default: - throw new org.apache.poi.util.RecordFormatException("Bad special value code (" + result[0] + ")"); - } - return new SpecialCachedValue(result); - } - - public void serialize(LittleEndianOutput out) { - out.write(_variableData); - out.writeShort(0xFFFF); - } - - public String formatDebugString() { - return formatValue() + ' ' + HexDump.toHex(_variableData); - } - - private String formatValue() { - int typeCode = getTypeCode(); - switch (typeCode) { - case STRING: - return "<string>"; - case BOOLEAN: - return getDataValue() == 0 ? "FALSE" : "TRUE"; - case ERROR_CODE: - return ErrorEval.getText(getDataValue()); - case EMPTY: - return "<empty>"; - } - return "#error(type=" + typeCode + ")#"; - } - - private int getDataValue() { - return _variableData[DATA_INDEX]; - } - - public static SpecialCachedValue createCachedEmptyValue() { - return create(EMPTY, 0); - } - - public static SpecialCachedValue createForString() { - return create(STRING, 0); - } - - public static SpecialCachedValue createCachedBoolean(boolean b) { - return create(BOOLEAN, b ? 1 : 0); - } - - public static SpecialCachedValue createCachedErrorCode(int errorCode) { - return create(ERROR_CODE, errorCode); - } - - private static SpecialCachedValue create(int code, int data) { - byte[] vd = { - (byte) code, - 0, - (byte) data, - 0, - 0, - 0, - }; - return new SpecialCachedValue(vd); - } - - @Override - public String toString() { - return getClass().getName() + '[' + formatValue() + ']'; - } - - public int getValueType() { - int typeCode = getTypeCode(); - switch (typeCode) { - case STRING: return CellType.STRING.getCode(); - case BOOLEAN: return CellType.BOOLEAN.getCode(); - case ERROR_CODE: return CellType.ERROR.getCode(); - case EMPTY: return CellType.STRING.getCode(); // is this correct? - } - throw new IllegalStateException("Unexpected type id (" + typeCode + ")"); - } - - public boolean getBooleanValue() { - if (getTypeCode() != BOOLEAN) { - throw new IllegalStateException("Not a boolean cached value - " + formatValue()); - } - return getDataValue() != 0; - } - - public int getErrorValue() { - if (getTypeCode() != ERROR_CODE) { - throw new IllegalStateException("Not an error cached value - " + formatValue()); - } - return getDataValue(); - } - } - private double field_4_value; private short field_5_options; /** @@ -193,19 +53,27 @@ public final class FormulaRecord extends /** * Since the NaN support seems sketchy (different constants) we'll store and spit it out directly */ - private SpecialCachedValue specialCachedValue; + private FormulaSpecialCachedValue specialCachedValue; /** Creates new FormulaRecord */ - public FormulaRecord() { field_8_parsed_expr = Formula.create(Ptg.EMPTY_PTG_ARRAY); } + public FormulaRecord(FormulaRecord other) { + super(other); + field_4_value = other.field_4_value; + field_5_options = other.field_5_options; + field_6_zero = other.field_6_zero; + field_8_parsed_expr = (other.field_8_parsed_expr == null) ? null : new Formula(other.field_8_parsed_expr); + specialCachedValue = (other.specialCachedValue == null) ? null : new FormulaSpecialCachedValue(other.specialCachedValue); + } + public FormulaRecord(RecordInputStream ris) { super(ris); long valueLongBits = ris.readLong(); field_5_options = ris.readShort(); - specialCachedValue = SpecialCachedValue.create(valueLongBits); + specialCachedValue = FormulaSpecialCachedValue.create(valueLongBits); if (specialCachedValue == null) { field_4_value = Double.longBitsToDouble(valueLongBits); } @@ -228,16 +96,16 @@ public final class FormulaRecord extends } public void setCachedResultTypeEmptyString() { - specialCachedValue = SpecialCachedValue.createCachedEmptyValue(); + specialCachedValue = FormulaSpecialCachedValue.createCachedEmptyValue(); } public void setCachedResultTypeString() { - specialCachedValue = SpecialCachedValue.createForString(); + specialCachedValue = FormulaSpecialCachedValue.createForString(); } public void setCachedResultErrorCode(int errorCode) { - specialCachedValue = SpecialCachedValue.createCachedErrorCode(errorCode); + specialCachedValue = FormulaSpecialCachedValue.createCachedErrorCode(errorCode); } public void setCachedResultBoolean(boolean value) { - specialCachedValue = SpecialCachedValue.createCachedBoolean(value); + specialCachedValue = FormulaSpecialCachedValue.createCachedBoolean(value); } /** * @return <code>true</code> if this {@link FormulaRecord} is followed by a @@ -246,7 +114,7 @@ public final class FormulaRecord extends */ public boolean hasCachedResultString() { return specialCachedValue != null && - specialCachedValue.getTypeCode() == SpecialCachedValue.STRING; + specialCachedValue.getTypeCode() == FormulaSpecialCachedValue.STRING; } public int getCachedResultType() { @@ -353,12 +221,12 @@ public final class FormulaRecord extends out.writeInt(field_6_zero); // may as well write original data back so as to minimise differences from original field_8_parsed_expr.serialize(out); } - + @Override protected String getRecordName() { return "FORMULA"; } - + @Override protected void appendValueText(StringBuilder sb) { sb.append(" .value = "); @@ -385,15 +253,16 @@ public final class FormulaRecord extends } @Override - public FormulaRecord clone() { - FormulaRecord rec = new FormulaRecord(); - copyBaseFields(rec); - rec.field_4_value = field_4_value; - rec.field_5_options = field_5_options; - rec.field_6_zero = field_6_zero; - rec.field_8_parsed_expr = field_8_parsed_expr; - rec.specialCachedValue = specialCachedValue; - return rec; + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") + public FormulaRecord clone() { + return copy(); + } + + @Override + public FormulaRecord copy() { + return new FormulaRecord(this); } } Added: poi/trunk/src/java/org/apache/poi/hssf/record/FormulaSpecialCachedValue.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FormulaSpecialCachedValue.java?rev=1871911&view=auto ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FormulaSpecialCachedValue.java (added) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FormulaSpecialCachedValue.java Sun Dec 22 21:44:45 2019 @@ -0,0 +1,167 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.hssf.record; + +import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.Internal; +import org.apache.poi.util.LittleEndianOutput; + +/** + * Manages the cached formula result values of other types besides numeric. + * Excel encodes the same 8 bytes that would be field_4_value with various NaN + * values that are decoded/encoded by this class. + */ +@Internal +public final class FormulaSpecialCachedValue { + /** deliberately chosen by Excel in order to encode other values within Double NaNs */ + private static final long BIT_MARKER = 0xFFFF000000000000L; + private static final int VARIABLE_DATA_LENGTH = 6; + private static final int DATA_INDEX = 2; + + // FIXME: can these be merged with {@link CellType}? + // are the numbers specific to the HSSF formula record format or just a poor-man's enum? + public static final int STRING = 0; + public static final int BOOLEAN = 1; + public static final int ERROR_CODE = 2; + public static final int EMPTY = 3; + + private final byte[] _variableData; + + FormulaSpecialCachedValue(FormulaSpecialCachedValue other) { + _variableData = (other._variableData == null) ? null : other._variableData.clone(); + } + + private FormulaSpecialCachedValue(byte[] data) { + _variableData = data; + } + + public int getTypeCode() { + return _variableData[0]; + } + + /** + * @return <code>null</code> if the double value encoded by <tt>valueLongBits</tt> + * is a normal (non NaN) double value. + */ + public static FormulaSpecialCachedValue create(long valueLongBits) { + if ((BIT_MARKER & valueLongBits) != BIT_MARKER) { + return null; + } + + byte[] result = new byte[VARIABLE_DATA_LENGTH]; + long x = valueLongBits; + for (int i=0; i<VARIABLE_DATA_LENGTH; i++) { + result[i] = (byte) x; + x >>= 8; + } + switch (result[0]) { + case STRING: + case BOOLEAN: + case ERROR_CODE: + case EMPTY: + break; + default: + throw new org.apache.poi.util.RecordFormatException("Bad special value code (" + result[0] + ")"); + } + return new FormulaSpecialCachedValue(result); + } + + public void serialize(LittleEndianOutput out) { + out.write(_variableData); + out.writeShort(0xFFFF); + } + + public String formatDebugString() { + return formatValue() + ' ' + HexDump.toHex(_variableData); + } + + private String formatValue() { + int typeCode = getTypeCode(); + switch (typeCode) { + case STRING: + return "<string>"; + case BOOLEAN: + return getDataValue() == 0 ? "FALSE" : "TRUE"; + case ERROR_CODE: + return ErrorEval.getText(getDataValue()); + case EMPTY: + return "<empty>"; + } + return "#error(type=" + typeCode + ")#"; + } + + private int getDataValue() { + return _variableData[DATA_INDEX]; + } + + public static FormulaSpecialCachedValue createCachedEmptyValue() { + return create(EMPTY, 0); + } + + public static FormulaSpecialCachedValue createForString() { + return create(STRING, 0); + } + + public static FormulaSpecialCachedValue createCachedBoolean(boolean b) { + return create(BOOLEAN, b ? 1 : 0); + } + + public static FormulaSpecialCachedValue createCachedErrorCode(int errorCode) { + return create(ERROR_CODE, errorCode); + } + + private static FormulaSpecialCachedValue create(int code, int data) { + byte[] vd = { (byte) code, 0, (byte) data, 0, 0, 0, }; + return new FormulaSpecialCachedValue(vd); + } + + @Override + public String toString() { + return getClass().getName() + '[' + formatValue() + ']'; + } + + public int getValueType() { + int typeCode = getTypeCode(); + switch (typeCode) { + case EMPTY: // is this correct? + case STRING: + return CellType.STRING.getCode(); + case BOOLEAN: + return CellType.BOOLEAN.getCode(); + case ERROR_CODE: + return CellType.ERROR.getCode(); + } + throw new IllegalStateException("Unexpected type id (" + typeCode + ")"); + } + + public boolean getBooleanValue() { + if (getTypeCode() != BOOLEAN) { + throw new IllegalStateException("Not a boolean cached value - " + formatValue()); + } + return getDataValue() != 0; + } + + public int getErrorValue() { + if (getTypeCode() != ERROR_CODE) { + throw new IllegalStateException("Not an error cached value - " + formatValue()); + } + return getDataValue(); + } +} Propchange: poi/trunk/src/java/org/apache/poi/hssf/record/FormulaSpecialCachedValue.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java Sun Dec 22 21:44:45 2019 @@ -22,28 +22,31 @@ import org.apache.poi.util.IOUtils; import org.apache.poi.util.LittleEndianInput; import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.RecordFormatException; +import org.apache.poi.util.Removal; /** * This structure appears as part of an Obj record that represents a checkbox or radio button. - * - * @author Yegor Kozlov */ -public final class FtCblsSubRecord extends SubRecord implements Cloneable { - public final static short sid = 0x0C; +public final class FtCblsSubRecord extends SubRecord { + public static final short sid = 0x0C; private static final int ENCODED_SIZE = 20; - private byte[] reserved; + private final byte[] reserved; /** * Construct a new <code>FtCblsSubRecord</code> and * fill its data with the default values */ - public FtCblsSubRecord() - { + public FtCblsSubRecord() { reserved = new byte[ENCODED_SIZE]; } + public FtCblsSubRecord(FtCblsSubRecord other) { + super(other); + reserved = other.reserved.clone(); + } + public FtCblsSubRecord(LittleEndianInput in, int size) { if (size != ENCODED_SIZE) { throw new RecordFormatException("Unexpected size (" + size + ")"); @@ -93,12 +96,16 @@ public final class FtCblsSubRecord exten } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public FtCblsSubRecord clone() { - FtCblsSubRecord rec = new FtCblsSubRecord(); - byte[] recdata = new byte[reserved.length]; - System.arraycopy(reserved, 0, recdata, 0, recdata.length); - rec.reserved = recdata; - return rec; + return copy(); + } + + @Override + public FtCblsSubRecord copy() { + return new FtCblsSubRecord(this); } } \ No newline at end of file Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FtCfSubRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FtCfSubRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FtCfSubRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FtCfSubRecord.java Sun Dec 22 21:44:45 2019 @@ -21,15 +21,16 @@ import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndianInput; import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.RecordFormatException; +import org.apache.poi.util.Removal; /** * The FtCf structure specifies the clipboard format of the picture-type Obj record containing this FtCf. */ -public final class FtCfSubRecord extends SubRecord implements Cloneable { - public final static short sid = 0x07; - public final static short length = 0x02; - +public final class FtCfSubRecord extends SubRecord { + public static final short sid = 0x07; + public static final short length = 0x02; + /** * Specifies the format of the picture is an enhanced metafile. */ @@ -39,20 +40,24 @@ public final class FtCfSubRecord extends * Specifies the format of the picture is a bitmap. */ public static final short BITMAP_BIT = (short)0x0009; - + /** * Specifies the picture is in an unspecified format that is * neither and enhanced metafile nor a bitmap. */ public static final short UNSPECIFIED_BIT = (short)0xFFFF; - + private short flags; /** * Construct a new <code>FtPioGrbitSubRecord</code> and * fill its data with the default values */ - public FtCfSubRecord() { + public FtCfSubRecord() {} + + public FtCfSubRecord(FtCfSubRecord other) { + super(other); + flags = other.flags; } public FtCfSubRecord(LittleEndianInput in, int size) { @@ -99,10 +104,16 @@ public final class FtCfSubRecord extends } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public FtCfSubRecord clone() { - FtCfSubRecord rec = new FtCfSubRecord(); - rec.flags = this.flags; - return rec; + return copy(); + } + + @Override + public FtCfSubRecord copy() { + return new FtCfSubRecord(this); } public short getFlags() { Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FtPioGrbitSubRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FtPioGrbitSubRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/FtPioGrbitSubRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/FtPioGrbitSubRecord.java Sun Dec 22 21:44:45 2019 @@ -21,27 +21,28 @@ import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndianInput; import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.RecordFormatException; +import org.apache.poi.util.Removal; /** * This structure appears as part of an Obj record that represents image display properties. */ -public final class FtPioGrbitSubRecord extends SubRecord implements Cloneable { - public final static short sid = 0x08; - public final static short length = 0x02; - +public final class FtPioGrbitSubRecord extends SubRecord { + public static final short sid = 0x08; + public static final short length = 0x02; + /** - * A bit that specifies whether the picture's aspect ratio is preserved when rendered in + * A bit that specifies whether the picture's aspect ratio is preserved when rendered in * different views (Normal view, Page Break Preview view, Page Layout view and printing). */ public static final int AUTO_PICT_BIT = 1 << 0; /** - * A bit that specifies whether the pictFmla field of the Obj record that contains + * A bit that specifies whether the pictFmla field of the Obj record that contains * this FtPioGrbit specifies a DDE reference. */ public static final int DDE_BIT = 1 << 1; - + /** * A bit that specifies whether this object is expected to be updated on print to * reflect the values in the cell associated with the object. @@ -52,44 +53,48 @@ public final class FtPioGrbitSubRecord e * A bit that specifies whether the picture is displayed as an icon. */ public static final int ICON_BIT = 1 << 3; - + /** * A bit that specifies whether this object is an ActiveX control. * It MUST NOT be the case that both fCtl and fDde are equal to 1. */ public static final int CTL_BIT = 1 << 4; - + /** * A bit that specifies whether the object data are stored in an * embedding storage (= 0) or in the controls stream (ctls) (= 1). */ public static final int PRSTM_BIT = 1 << 5; - + /** * A bit that specifies whether this is a camera picture. */ public static final int CAMERA_BIT = 1 << 7; - + /** * A bit that specifies whether this picture's size has been explicitly set. * 0 = picture size has been explicitly set, 1 = has not been set */ public static final int DEFAULT_SIZE_BIT = 1 << 8; - + /** * A bit that specifies whether the OLE server for the object is called * to load the object's data automatically when the parent workbook is opened. */ public static final int AUTO_LOAD_BIT = 1 << 9; - + private short flags; /** * Construct a new <code>FtPioGrbitSubRecord</code> and * fill its data with the default values */ - public FtPioGrbitSubRecord() { + public FtPioGrbitSubRecord() {} + + public FtPioGrbitSubRecord(FtPioGrbitSubRecord other) { + super(other); + flags = other.flags; } public FtPioGrbitSubRecord(LittleEndianInput in, int size) { @@ -110,12 +115,12 @@ public final class FtPioGrbitSubRecord e } else { flags &= (0xFFFF ^ bitmask); } - } - + } + public boolean getFlagByBit(int bitmask) { return ((flags & bitmask) != 0); } - + /** * Convert this record to string. * Used by BiffViewer and other utilities. @@ -153,10 +158,16 @@ public final class FtPioGrbitSubRecord e } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public FtPioGrbitSubRecord clone() { - FtPioGrbitSubRecord rec = new FtPioGrbitSubRecord(); - rec.flags = this.flags; - return rec; + return copy(); + } + + @Override + public FtPioGrbitSubRecord copy() { + return new FtPioGrbitSubRecord(this); } public short getFlags() { Modified: poi/trunk/src/java/org/apache/poi/hssf/record/GridsetRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/GridsetRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/GridsetRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/GridsetRecord.java Sun Dec 22 21:44:45 2019 @@ -18,28 +18,25 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; /** - * Title: Gridset Record.<P> - * Description: flag denoting whether the user specified that gridlines are used when - * printing.<P> - * REFERENCE: PG 320 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * - * @author Andrew C. Oliver (acoliver at apache dot org) - * @author Glen Stampoultzis (glens at apache.org) - * @author Jason Height (jheight at chariot dot net dot au) + * Flag denoting whether the user specified that gridlines are used when printing. * * @version 2.0-pre */ -public final class GridsetRecord extends StandardRecord implements Cloneable { - public final static short sid = 0x82; +public final class GridsetRecord extends StandardRecord { + public static final short sid = 0x82; public short field_1_gridset_flag; - public GridsetRecord() { + public GridsetRecord() {} + + public GridsetRecord(GridsetRecord other) { + super(other); + field_1_gridset_flag = other.field_1_gridset_flag; } - public GridsetRecord(RecordInputStream in) - { + public GridsetRecord(RecordInputStream in) { field_1_gridset_flag = in.readShort(); } @@ -87,9 +84,15 @@ public final class GridsetRecord extends } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public GridsetRecord clone() { - GridsetRecord rec = new GridsetRecord(); - rec.field_1_gridset_flag = field_1_gridset_flag; - return rec; + return copy(); + } + + @Override + public GridsetRecord copy() { + return new GridsetRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/GroupMarkerSubRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/GroupMarkerSubRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/GroupMarkerSubRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/GroupMarkerSubRecord.java Sun Dec 22 21:44:45 2019 @@ -21,13 +21,14 @@ import org.apache.poi.util.HexDump; import org.apache.poi.util.IOUtils; import org.apache.poi.util.LittleEndianInput; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; /** * ftGmo (0x0006)<p> * The group marker record is used as a position holder for groups. */ -public final class GroupMarkerSubRecord extends SubRecord implements Cloneable { - public final static short sid = 0x0006; +public final class GroupMarkerSubRecord extends SubRecord { + public static final short sid = 0x0006; //arbitrarily selected; may need to increase private static final int MAX_RECORD_LENGTH = 100_000; @@ -41,6 +42,11 @@ public final class GroupMarkerSubRecord reserved = EMPTY_BYTE_ARRAY; } + public GroupMarkerSubRecord(GroupMarkerSubRecord other) { + super(other); + reserved = other.reserved.clone(); + } + public GroupMarkerSubRecord(LittleEndianInput in, int size) { byte[] buf = IOUtils.safelyAllocate(size, MAX_RECORD_LENGTH); in.readFully(buf); @@ -74,10 +80,15 @@ public final class GroupMarkerSubRecord } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public GroupMarkerSubRecord clone() { - GroupMarkerSubRecord rec = new GroupMarkerSubRecord(); - rec.reserved = new byte[reserved.length]; - System.arraycopy(reserved, 0, rec.reserved, 0, reserved.length); - return rec; + return copy(); + } + + @Override + public GroupMarkerSubRecord copy() { + return new GroupMarkerSubRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/GutsRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/GutsRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/GutsRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/GutsRecord.java Sun Dec 22 21:44:45 2019 @@ -15,34 +15,41 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; /** - * Title: Guts Record <P> - * Description: Row/column gutter sizes <P> - * REFERENCE: PG 320 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * @author Andrew C. Oliver (acoliver at apache dot org) - * @author Jason Height (jheight at chariot dot net dot au) + * Row/column gutter sizes + * * @version 2.0-pre */ -public final class GutsRecord extends StandardRecord implements Cloneable { - public final static short sid = 0x80; - private short field_1_left_row_gutter; // size of the row gutter to the left of the rows - private short field_2_top_col_gutter; // size of the column gutter above the columns - private short field_3_row_level_max; // maximum outline level for row gutters - private short field_4_col_level_max; // maximum outline level for column gutters - - public GutsRecord() - { +public final class GutsRecord extends StandardRecord { + public static final short sid = 0x80; + /** size of the row gutter to the left of the rows */ + private short field_1_left_row_gutter; + /** size of the column gutter above the columns */ + private short field_2_top_col_gutter; + /** maximum outline level for row gutters */ + private short field_3_row_level_max; + /** maximum outline level for column gutters */ + private short field_4_col_level_max; + + public GutsRecord() {} + + public GutsRecord(GutsRecord other) { + super(other); + field_1_left_row_gutter = other.field_1_left_row_gutter; + field_2_top_col_gutter = other.field_2_top_col_gutter; + field_3_row_level_max = other.field_3_row_level_max; + field_4_col_level_max = other.field_4_col_level_max; } - public GutsRecord(RecordInputStream in) - { + public GutsRecord(RecordInputStream in) { field_1_left_row_gutter = in.readShort(); field_2_top_col_gutter = in.readShort(); field_3_row_level_max = in.readShort(); @@ -171,12 +178,15 @@ public final class GutsRecord extends St } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public GutsRecord clone() { - GutsRecord rec = new GutsRecord(); - rec.field_1_left_row_gutter = field_1_left_row_gutter; - rec.field_2_top_col_gutter = field_2_top_col_gutter; - rec.field_3_row_level_max = field_3_row_level_max; - rec.field_4_col_level_max = field_4_col_level_max; - return rec; + return copy(); + } + + @Override + public GutsRecord copy() { + return new GutsRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/HCenterRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/HCenterRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/HCenterRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/HCenterRecord.java Sun Dec 22 21:44:45 2019 @@ -17,24 +17,25 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; /** - * Title: HCenter record (0x0083)<P> - * Description: whether to center between horizontal margins<P> - * REFERENCE: PG 320 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * @author Andrew C. Oliver (acoliver at apache dot org) - * @author Jason Height (jheight at chariot dot net dot au) + * Whether to center between horizontal margins + * * @version 2.0-pre */ -public final class HCenterRecord extends StandardRecord implements Cloneable { - public final static short sid = 0x0083; - private short field_1_hcenter; +public final class HCenterRecord extends StandardRecord { + public static final short sid = 0x0083; + private short field_1_hcenter; - public HCenterRecord() { + public HCenterRecord() {} + + public HCenterRecord(HCenterRecord other) { + super(other); + field_1_hcenter = other.field_1_hcenter; } - public HCenterRecord(RecordInputStream in) - { + public HCenterRecord(RecordInputStream in) { field_1_hcenter = in.readShort(); } @@ -43,11 +44,7 @@ public final class HCenterRecord extends * @param hc center - t/f */ public void setHCenter(boolean hc) { - if (hc) { - field_1_hcenter = 1; - } else { - field_1_hcenter = 0; - } + field_1_hcenter = (short)(hc ? 1 : 0); } /** @@ -80,9 +77,15 @@ public final class HCenterRecord extends } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public HCenterRecord clone() { - HCenterRecord rec = new HCenterRecord(); - rec.field_1_hcenter = field_1_hcenter; - return rec; + return copy(); + } + + @Override + public HCenterRecord copy() { + return new HCenterRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterBase.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterBase.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterBase.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterBase.java Sun Dec 22 21:44:45 2019 @@ -22,8 +22,6 @@ import org.apache.poi.util.StringUtil; /** * Common header/footer base class - * - * @author Josh Micich */ public abstract class HeaderFooterBase extends StandardRecord { private boolean field_2_hasMultibyte; @@ -33,6 +31,12 @@ public abstract class HeaderFooterBase e setText(text); } + protected HeaderFooterBase(HeaderFooterBase other) { + super(other); + field_2_hasMultibyte = other.field_2_hasMultibyte; + field_3_text = other.field_3_text; + } + protected HeaderFooterBase(RecordInputStream in) { if (in.remaining() > 0) { int field_1_footer_len = in.readShort(); @@ -107,4 +111,7 @@ public abstract class HeaderFooterBase e } return 3 + getTextLength() * (field_2_hasMultibyte ? 2 : 1); } + + @Override + public abstract HeaderFooterBase copy(); } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/HeaderFooterRecord.java Sun Dec 22 21:44:45 2019 @@ -17,28 +17,31 @@ package org.apache.poi.hssf.record; -import org.apache.poi.util.HexDump; -import org.apache.poi.util.LittleEndianOutput; - import java.util.Arrays; import java.util.Locale; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; + /** * The HEADERFOOTER record stores information added in Office Excel 2007 for headers/footers. - * - * @author Yegor Kozlov */ -public final class HeaderFooterRecord extends StandardRecord implements Cloneable { - +public final class HeaderFooterRecord extends StandardRecord { + public static final short sid = 0x089C; private static final byte[] BLANK_GUID = new byte[16]; - public final static short sid = 0x089C; private byte[] _rawData; public HeaderFooterRecord(byte[] data) { _rawData = data; } + public HeaderFooterRecord(HeaderFooterRecord other) { + super(other); + _rawData = (other._rawData == null) ? null : other._rawData.clone(); + } + /** * construct a HeaderFooterRecord record. No fields are interpreted and the record will * be serialized in its original form more or less @@ -58,7 +61,7 @@ public final class HeaderFooterRecord ex protected int getDataSize() { return _rawData.length; } - + public short getSid() { return sid; @@ -79,7 +82,7 @@ public final class HeaderFooterRecord ex } /** - * @return whether this record belongs to the current sheet + * @return whether this record belongs to the current sheet */ public boolean isCurrentSheet(){ return Arrays.equals(getGuid(), BLANK_GUID); @@ -96,10 +99,17 @@ public final class HeaderFooterRecord ex } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public HeaderFooterRecord clone() { - //HACK: do a "cheat" clone, see Record.java for more information - return (HeaderFooterRecord)cloneViaReserialise(); + return copy(); } - - + + @Override + public HeaderFooterRecord copy() { + return new HeaderFooterRecord(this); + } + + } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/HeaderRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/HeaderRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/HeaderRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/HeaderRecord.java Sun Dec 22 21:44:45 2019 @@ -17,21 +17,22 @@ package org.apache.poi.hssf.record; +import org.apache.poi.util.Removal; + /** - * Title: Header Record<P> - * Description: Specifies a header for a sheet<P> - * REFERENCE: PG 321 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * @author Andrew C. Oliver (acoliver at apache dot org) - * @author Shawn Laubach (slaubach at apache dot org) Modified 3/14/02 - * @author Jason Height (jheight at chariot dot net dot au) + * Specifies a header for a sheet */ -public final class HeaderRecord extends HeaderFooterBase implements Cloneable { - public final static short sid = 0x0014; +public final class HeaderRecord extends HeaderFooterBase { + public static final short sid = 0x0014; public HeaderRecord(String text) { super(text); } + public HeaderRecord(HeaderRecord other) { + super(other); + } + public HeaderRecord(RecordInputStream in) { super(in); } @@ -50,7 +51,15 @@ public final class HeaderRecord extends } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public HeaderRecord clone() { - return new HeaderRecord(getText()); + return copy(); + } + + @Override + public HeaderRecord copy() { + return new HeaderRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/HideObjRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/HideObjRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/HideObjRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/HideObjRecord.java Sun Dec 22 21:44:45 2019 @@ -15,35 +15,33 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndianOutput; /** - * Title: Hide Object Record<P> - * Description: flag defines whether to hide placeholders and object<P> - * REFERENCE: PG 321 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * @author Andrew C. Oliver (acoliver at apache dot org) + * Flag defines whether to hide placeholders and object + * * @version 2.0-pre */ +public final class HideObjRecord extends StandardRecord { + public static final short sid = 0x8d; + public static final short HIDE_ALL = 2; + public static final short SHOW_PLACEHOLDERS = 1; + public static final short SHOW_ALL = 0; -public final class HideObjRecord - extends StandardRecord -{ - public final static short sid = 0x8d; - public final static short HIDE_ALL = 2; - public final static short SHOW_PLACEHOLDERS = 1; - public final static short SHOW_ALL = 0; - private short field_1_hide_obj; + private short field_1_hide_obj; - public HideObjRecord() - { + public HideObjRecord() {} + + public HideObjRecord(HideObjRecord other) { + super(other); + field_1_hide_obj = other.field_1_hide_obj; } - public HideObjRecord(RecordInputStream in) - { + public HideObjRecord(RecordInputStream in) { field_1_hide_obj = in.readShort(); } @@ -98,4 +96,9 @@ public final class HideObjRecord { return sid; } + + @Override + public HideObjRecord copy() { + return new HideObjRecord(this); + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/HorizontalPageBreakRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/HorizontalPageBreakRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/HorizontalPageBreakRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/HorizontalPageBreakRecord.java Sun Dec 22 21:44:45 2019 @@ -17,21 +17,24 @@ package org.apache.poi.hssf.record; -import java.util.Iterator; +import org.apache.poi.util.Removal; /** * HorizontalPageBreak (0x001B) record that stores page breaks at rows - * + * * @see PageBreakRecord */ -public final class HorizontalPageBreakRecord extends PageBreakRecord implements Cloneable { +public final class HorizontalPageBreakRecord extends PageBreakRecord { public static final short sid = 0x001B; /** * Creates an empty horizontal page break record */ - public HorizontalPageBreakRecord() { + public HorizontalPageBreakRecord() {} + + public HorizontalPageBreakRecord(HorizontalPageBreakRecord other) { + super(other); } /** @@ -46,13 +49,15 @@ public final class HorizontalPageBreakRe } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public PageBreakRecord clone() { - PageBreakRecord result = new HorizontalPageBreakRecord(); - Iterator<Break> iterator = getBreaksIterator(); - while (iterator.hasNext()) { - Break original = iterator.next(); - result.addBreak(original.main, original.subFrom, original.subTo); - } - return result; + return copy(); + } + + @Override + public HorizontalPageBreakRecord copy() { + return new HorizontalPageBreakRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/HyperlinkRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/HyperlinkRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/HyperlinkRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/HyperlinkRecord.java Sun Dec 22 21:44:45 2019 @@ -27,6 +27,7 @@ import org.apache.poi.util.LittleEndianO import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.util.RecordFormatException; +import org.apache.poi.util.Removal; import org.apache.poi.util.StringUtil; /** @@ -34,13 +35,14 @@ import org.apache.poi.util.StringUtil; * from the Excel-97 format. * Supports only external links for now (eg http://) */ -public final class HyperlinkRecord extends StandardRecord implements Cloneable { - public final static short sid = 0x01B8; +public final class HyperlinkRecord extends StandardRecord { + public static final short sid = 0x01B8; private static POILogger logger = POILogFactory.getLogger(HyperlinkRecord.class); //arbitrarily selected; may need to increase private static final int MAX_RECORD_LENGTH = 100_000; + // TODO: replace with ClassID static final class GUID { /* * this class is currently only used here, but could be moved to a @@ -61,6 +63,13 @@ public final class HyperlinkRecord exten */ private final long _d4; + public GUID(GUID other) { + _d1 = other._d1; + _d2 = other._d2; + _d3 = other._d3; + _d4 = other._d4; + } + public GUID(LittleEndianInput in) { this(in.readInt(), in.readUShort(), in.readUShort(), in.readLong()); } @@ -199,24 +208,24 @@ public final class HyperlinkRecord exten } } - /** + /* * Link flags */ - static final int HLINK_URL = 0x01; // File link or URL. - static final int HLINK_ABS = 0x02; // Absolute path. - static final int HLINK_LABEL = 0x14; // Has label/description. + static final int HLINK_URL = 0x01; // File link or URL. + static final int HLINK_ABS = 0x02; // Absolute path. + static final int HLINK_LABEL = 0x14; // Has label/description. /** Place in worksheet. If set, the {@link #_textMark} field will be present */ - static final int HLINK_PLACE = 0x08; + static final int HLINK_PLACE = 0x08; private static final int HLINK_TARGET_FRAME = 0x80; // has 'target frame' private static final int HLINK_UNC_PATH = 0x100; // has UNC path - final static GUID STD_MONIKER = GUID.parse("79EAC9D0-BAF9-11CE-8C82-00AA004BA90B"); - final static GUID URL_MONIKER = GUID.parse("79EAC9E0-BAF9-11CE-8C82-00AA004BA90B"); - final static GUID FILE_MONIKER = GUID.parse("00000303-0000-0000-C000-000000000046"); + static final GUID STD_MONIKER = GUID.parse("79EAC9D0-BAF9-11CE-8C82-00AA004BA90B"); + static final GUID URL_MONIKER = GUID.parse("79EAC9E0-BAF9-11CE-8C82-00AA004BA90B"); + static final GUID FILE_MONIKER = GUID.parse("00000303-0000-0000-C000-000000000046"); /** expected Tail of a URL link */ - private final static byte[] URL_TAIL = HexRead.readFromString("79 58 81 F4 3B 1D 7F 48 AF 2C 82 5D C4 85 27 63 00 00 00 00 A5 AB 00 00"); + private static final byte[] URL_TAIL = HexRead.readFromString("79 58 81 F4 3B 1D 7F 48 AF 2C 82 5D C4 85 27 63 00 00 00 00 A5 AB 00 00"); /** expected Tail of a file link */ - private final static byte[] FILE_TAIL = HexRead.readFromString("FF FF AD DE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"); + private static final byte[] FILE_TAIL = HexRead.readFromString("FF FF AD DE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"); private static final int TAIL_SIZE = FILE_TAIL.length; @@ -246,17 +255,31 @@ public final class HyperlinkRecord exten * This field is optional. If present, the {@link #HLINK_PLACE} must be set. */ private String _textMark; - + private byte[] _uninterpretedTail; /** * Create a new hyperlink */ - public HyperlinkRecord() - { + public HyperlinkRecord() {} + + public HyperlinkRecord(HyperlinkRecord other) { + super(other); + _range = (other._range == null) ? null : other._range.copy(); + _guid = (other._guid == null) ? null : new GUID(other._guid); + _fileOpts = other._fileOpts; + _linkOpts = other._linkOpts; + _label = other._label; + _targetFrame = other._targetFrame; + _moniker = (other._moniker == null) ? null : new GUID(other._moniker); + _shortFilename = other._shortFilename; + _address = other._address; + _textMark = other._textMark; + _uninterpretedTail = (other._uninterpretedTail == null) ? null : other._uninterpretedTail.clone(); } + /** * @return the 0-based column of the first cell that contains this hyperlink */ @@ -266,7 +289,7 @@ public final class HyperlinkRecord exten /** * Set the first column (zero-based) of the range that contains this hyperlink - * + * * @param firstCol the first column (zero-based) */ public void setFirstColumn(int firstCol) { @@ -282,7 +305,7 @@ public final class HyperlinkRecord exten /** * Set the last column (zero-based) of the range that contains this hyperlink - * + * * @param lastCol the last column (zero-based) */ public void setLastColumn(int lastCol) { @@ -298,7 +321,7 @@ public final class HyperlinkRecord exten /** * Set the first row (zero-based) of the range that contains this hyperlink - * + * * @param firstRow the first row (zero-based) */ public void setFirstRow(int firstRow) { @@ -314,7 +337,7 @@ public final class HyperlinkRecord exten /** * Set the last row (zero-based) of the range that contains this hyperlink - * + * * @param lastRow the last row (zero-based) */ public void setLastRow(int lastRow) { @@ -423,7 +446,7 @@ public final class HyperlinkRecord exten /** * Link options. Must be a combination of HLINK_* constants. * For testing only - * + * * @return Link options */ int getLinkOptions(){ @@ -541,7 +564,7 @@ public final class HyperlinkRecord exten } if (in.remaining() > 0) { - logger.log(POILogger.WARN, + logger.log(POILogger.WARN, "Hyperlink data remains: " + in.remaining() + " : " +HexDump.toHex(in.readRemainder()) ); @@ -699,31 +722,31 @@ public final class HyperlinkRecord exten /** * Based on the link options, is this a url? - * + * * @return true, if this is a url link */ public boolean isUrlLink() { - return (_linkOpts & HLINK_URL) > 0 + return (_linkOpts & HLINK_URL) > 0 && (_linkOpts & HLINK_ABS) > 0; } /** * Based on the link options, is this a file? - * + * * @return true, if this is a file link */ public boolean isFileLink() { - return (_linkOpts & HLINK_URL) > 0 + return (_linkOpts & HLINK_URL) > 0 && (_linkOpts & HLINK_ABS) == 0; } /** * Based on the link options, is this a document? - * + * * @return true, if this is a docment link */ public boolean isDocumentLink() { - return (_linkOpts & HLINK_PLACE) > 0; + return (_linkOpts & HLINK_PLACE) > 0; } - + /** * Initialize a new url link */ @@ -766,19 +789,15 @@ public final class HyperlinkRecord exten } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public HyperlinkRecord clone() { - HyperlinkRecord rec = new HyperlinkRecord(); - rec._range = _range.copy(); - rec._guid = _guid; - rec._linkOpts = _linkOpts; - rec._fileOpts = _fileOpts; - rec._label = _label; - rec._address = _address; - rec._moniker = _moniker; - rec._shortFilename = _shortFilename; - rec._targetFrame = _targetFrame; - rec._textMark = _textMark; - rec._uninterpretedTail = _uninterpretedTail; - return rec; + return copy(); + } + + @Override + public HyperlinkRecord copy() { + return new HyperlinkRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/IndexRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/IndexRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/IndexRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/IndexRecord.java Sun Dec 22 21:44:45 2019 @@ -20,27 +20,29 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.IntList; import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.RecordFormatException; +import org.apache.poi.util.Removal; /** - * Title: Index Record (0x020B)<p> - * Description: Occurs right after BOF, tells you where the DBCELL records are for a sheet - * Important for locating cells<p> - * - * REFERENCE: PG 323 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) + * Occurs right after BOF, tells you where the DBCELL records are for a sheet Important for locating cells */ -public final class IndexRecord extends StandardRecord implements Cloneable { - public final static short sid = 0x020B; +public final class IndexRecord extends StandardRecord { + public static final short sid = 0x020B; private int field_2_first_row; // first row on the sheet private int field_3_last_row_add1; // last row private int field_4_zero; // supposed to be zero private IntList field_5_dbcells; // array of offsets to DBCELL records - public IndexRecord() - { + public IndexRecord() {} + + public IndexRecord(IndexRecord other) { + super(other); + field_2_first_row = other.field_2_first_row; + field_3_last_row_add1 = other.field_3_last_row_add1; + field_4_zero = other.field_4_zero; + field_5_dbcells = (other.field_5_dbcells == null) ? null : new IntList(other.field_5_dbcells); } - public IndexRecord(RecordInputStream in) - { + public IndexRecord(RecordInputStream in) { int field_1_zero = in.readInt(); if (field_1_zero != 0) { throw new RecordFormatException("Expected zero for field 1 but got " + field_1_zero); @@ -48,7 +50,7 @@ public final class IndexRecord extends S field_2_first_row = in.readInt(); field_3_last_row_add1 = in.readInt(); field_4_zero = in.readInt(); - + int nCells = in.remaining() / 4; field_5_dbcells = new IntList(nCells); for(int i=0; i<nCells; i++) { @@ -139,14 +141,14 @@ public final class IndexRecord extends S return 16 // 4 ints + getNumDbcells() * 4; } - - /** + + /** * @param blockCount the number of blocks to be indexed * @return the size of an IndexRecord when it needs to index the specified number of blocks */ public static int getRecordSizeForBlockCount(int blockCount) { return 20 + 4 * blockCount; - } + } @Override public short getSid() { @@ -154,13 +156,15 @@ public final class IndexRecord extends S } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public IndexRecord clone() { - IndexRecord rec = new IndexRecord(); - rec.field_2_first_row = field_2_first_row; - rec.field_3_last_row_add1 = field_3_last_row_add1; - rec.field_4_zero = field_4_zero; - rec.field_5_dbcells = new IntList(); - rec.field_5_dbcells.addAll(field_5_dbcells); - return rec; + return copy(); + } + + @Override + public IndexRecord copy() { + return new IndexRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceEndRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceEndRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceEndRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceEndRecord.java Sun Dec 22 21:44:45 2019 @@ -21,11 +21,7 @@ import org.apache.poi.util.LittleEndianO import org.apache.poi.util.RecordFormatException; /** - * Title: Interface End Record (0x00E2)<P> - * Description: Shows where the Interface Records end (MMS) - * (has no fields)<P> - * REFERENCE: PG 324 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * @author Andrew C. Oliver (acoliver at apache dot org) + * Shows where the Interface Records ends (MMS) */ public final class InterfaceEndRecord extends StandardRecord { @@ -61,4 +57,9 @@ public final class InterfaceEndRecord ex public short getSid() { return sid; } + + @Override + public InterfaceEndRecord copy() { + return instance; + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceHdrRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceHdrRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceHdrRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/InterfaceHdrRecord.java Sun Dec 22 21:44:45 2019 @@ -21,19 +21,22 @@ import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndianOutput; /** - * Title: Interface Header Record (0x00E1)<P> - * Description: Defines the beginning of Interface records (MMS)<P> - * REFERENCE: PG 324 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * @author Andrew C. Oliver (acoliver at apache dot org) + * Defines the beginning of Interface records (MMS) */ public final class InterfaceHdrRecord extends StandardRecord { - public final static short sid = 0x00E1; - private final int _codepage; + public static final short sid = 0x00E1; /** * suggested (and probably correct) default */ - public final static int CODEPAGE = 0x04B0; + public static final int CODEPAGE = 0x04B0; + + private final int _codepage; + + public InterfaceHdrRecord(InterfaceHdrRecord other) { + super(other); + _codepage = other._codepage; + } public InterfaceHdrRecord(int codePage) { _codepage = codePage; @@ -63,4 +66,9 @@ public final class InterfaceHdrRecord ex public short getSid() { return sid; } + + @Override + public InterfaceHdrRecord copy() { + return new InterfaceHdrRecord(this); + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/IterationRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/IterationRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/IterationRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/IterationRecord.java Sun Dec 22 21:44:45 2019 @@ -21,28 +21,30 @@ 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; /** - * Title: Iteration Record (0x0011)<p> - * Description: Tells whether to iterate over formula calculations or not - * (if a formula is dependent upon another formula's result) - * (odd feature for something that can only have 32 elements in - * a formula!)<p> - * REFERENCE: PG 325 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) + * Tells whether to iterate over formula calculations or not. + * If a formula is dependent upon another formula's result. + * (odd feature for something that can only have 32 elements in a formula!) */ -public final class IterationRecord extends StandardRecord implements Cloneable { - public final static short sid = 0x0011; +public final class IterationRecord extends StandardRecord { + public static final short sid = 0x0011; private static final BitField iterationOn = BitFieldFactory.getInstance(0x0001); private int _flags; + public IterationRecord(IterationRecord other) { + super(other); + _flags = other._flags; + } + public IterationRecord(boolean iterateOn) { _flags = iterationOn.setBoolean(0, iterateOn); } - public IterationRecord(RecordInputStream in) - { + public IterationRecord(RecordInputStream in) { _flags = in.readShort(); } @@ -85,7 +87,15 @@ public final class IterationRecord exten } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public IterationRecord clone() { - return new IterationRecord(getIteration()); + return copy(); + } + + @Override + public IterationRecord copy() { + return new IterationRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/LabelRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/LabelRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/LabelRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/LabelRecord.java Sun Dec 22 21:44:45 2019 @@ -21,36 +21,43 @@ import org.apache.poi.util.HexDump; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.util.RecordFormatException; +import org.apache.poi.util.Removal; /** * Label Record (0x0204) - read only support for strings stored directly in the cell... - * Don't use this (except to read), use LabelSST instead <P> - * REFERENCE: PG 325 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) - * + * Don't use this (except to read), use LabelSST instead + * * @see org.apache.poi.hssf.record.LabelSSTRecord */ -public final class LabelRecord extends Record implements CellValueRecordInterface, Cloneable { - private final static POILogger logger = POILogFactory.getLogger(LabelRecord.class); +public final class LabelRecord extends Record implements CellValueRecordInterface { + private static final POILogger logger = POILogFactory.getLogger(LabelRecord.class); - public final static short sid = 0x0204; + public static final short sid = 0x0204; - private int field_1_row; - private short field_2_column; - private short field_3_xf_index; - private short field_4_string_len; - private byte field_5_unicode_flag; - private String field_6_value; + private int field_1_row; + private short field_2_column; + private short field_3_xf_index; + private short field_4_string_len; + private byte field_5_unicode_flag; + private String field_6_value; /** Creates new LabelRecord */ - public LabelRecord() - { + public LabelRecord() {} + + public LabelRecord(LabelRecord other) { + super(other); + field_1_row = other.field_1_row; + field_2_column = other.field_2_column; + field_3_xf_index = other.field_3_xf_index; + field_4_string_len = other.field_4_string_len; + field_5_unicode_flag = other.field_5_unicode_flag; + field_6_value = other.field_6_value; } /** * @param in the RecordInputstream to read the record from */ - public LabelRecord(RecordInputStream in) - { + public LabelRecord(RecordInputStream in) { field_1_row = in.readUShort(); field_2_column = in.readShort(); field_3_xf_index = in.readShort(); @@ -182,14 +189,15 @@ public final class LabelRecord extends R } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public LabelRecord clone() { - LabelRecord rec = new LabelRecord(); - rec.field_1_row = field_1_row; - rec.field_2_column = field_2_column; - rec.field_3_xf_index = field_3_xf_index; - rec.field_4_string_len = field_4_string_len; - rec.field_5_unicode_flag = field_5_unicode_flag; - rec.field_6_value = field_6_value; - return rec; + return copy(); + } + + @Override + public LabelRecord copy() { + return new LabelRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/LabelSSTRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/LabelSSTRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/LabelSSTRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/LabelSSTRecord.java Sun Dec 22 21:44:45 2019 @@ -19,18 +19,20 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; /** - * Title: Label SST Record<P> - * Description: Refers to a string in the shared string table and is a column value.<P> - * REFERENCE: PG 325 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) + * Refers to a string in the shared string table and is a column value. */ -public final class LabelSSTRecord extends CellRecord implements Cloneable { - public final static short sid = 0xfd; +public final class LabelSSTRecord extends CellRecord { + public static final short sid = 0xfd; private int field_4_sst_index; - public LabelSSTRecord() { - // fields uninitialised + public LabelSSTRecord() {} + + public LabelSSTRecord(LabelSSTRecord other) { + super(other); + field_4_sst_index = other.field_4_sst_index; } public LabelSSTRecord(RecordInputStream in) { @@ -58,7 +60,7 @@ public final class LabelSSTRecord extend public int getSSTIndex() { return field_4_sst_index; } - + @Override protected String getRecordName() { return "LABELSST"; @@ -85,10 +87,15 @@ public final class LabelSSTRecord extend } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public LabelSSTRecord clone() { - LabelSSTRecord rec = new LabelSSTRecord(); - copyBaseFields(rec); - rec.field_4_sst_index = field_4_sst_index; - return rec; + return copy(); + } + + @Override + public LabelSSTRecord copy() { + return new LabelSSTRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java Sun Dec 22 21:44:45 2019 @@ -16,11 +16,13 @@ ==================================================================== */ package org.apache.poi.hssf.record; +import org.apache.poi.common.Duplicatable; import org.apache.poi.ss.formula.ptg.Ptg; import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndianInput; import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.RecordFormatException; +import org.apache.poi.util.Removal; import org.apache.poi.util.StringUtil; /** @@ -89,6 +91,24 @@ public class LbsDataSubRecord extends Su */ private boolean[] _bsels; + LbsDataSubRecord() {} + + public LbsDataSubRecord(LbsDataSubRecord other) { + super(other); + _cbFContinued = other._cbFContinued; + _unknownPreFormulaInt = other._unknownPreFormulaInt; + _linkPtg = (other._linkPtg == null) ? null : other._linkPtg.copy(); + _unknownPostFormulaByte = other._unknownPostFormulaByte; + _cLines = other._cLines; + _iSel = other._iSel; + _flags = other._flags; + _idEdit = other._idEdit; + _dropData = (other._dropData == null) ? null : other._dropData.copy(); + _rgLines = (other._rgLines == null) ? null : other._rgLines.clone(); + _bsels = (other._bsels == null) ? null : other._bsels.clone(); + } + + /** * @param in the stream to read data from * @param cbFContinued the seconf short in the record header @@ -154,10 +174,6 @@ public class LbsDataSubRecord extends Su } - LbsDataSubRecord(){ - - } - /** * * @return a new instance of LbsDataSubRecord to construct auto-filters @@ -259,9 +275,16 @@ public class LbsDataSubRecord extends Su } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public LbsDataSubRecord clone() { - // TODO: is immutable ??? - return this; + return copy(); + } + + @Override + public LbsDataSubRecord copy() { + return new LbsDataSubRecord(this); } @Override @@ -303,7 +326,7 @@ public class LbsDataSubRecord extends Su /** * This structure specifies properties of the dropdown list control */ - public static class LbsDropData { + public static class LbsDropData implements Duplicatable { /** * Combo dropdown control */ @@ -318,7 +341,7 @@ public class LbsDataSubRecord extends Su public static final int STYLE_COMBO_SIMPLE_DROPDOWN = 2; /** - * An unsigned integer that specifies the style of this dropdown. + * An unsigned integer that specifies the style of this dropdown. */ private int _wStyle; @@ -343,12 +366,20 @@ public class LbsDataSubRecord extends Su */ private Byte _unused; - public LbsDropData(){ + public LbsDropData() { _str = ""; _unused = 0; } - public LbsDropData(LittleEndianInput in){ + public LbsDropData(LbsDropData other) { + _wStyle = other._wStyle; + _cLine = other._cLine; + _dxMin = other._dxMin; + _str = other._str; + _unused = other._unused; + } + + public LbsDropData(LittleEndianInput in) { _wStyle = in.readUShort(); _cLine = in.readUShort(); _dxMin = in.readUShort(); @@ -367,7 +398,7 @@ public class LbsDataSubRecord extends Su * <li>1: Combo Edit dropdown control</li> * <li>2: Simple dropdown control (just the dropdown button)</li> * </ul> - * + * * @param style the style - see possible values */ public void setStyle(int style){ @@ -376,7 +407,7 @@ public class LbsDataSubRecord extends Su /** * Set the number of lines to be displayed in the dropdown. - * + * * @param num the number of lines to be displayed in the dropdown */ public void setNumLines(int num){ @@ -417,5 +448,10 @@ public class LbsDataSubRecord extends Su return sb.toString(); } + + @Override + public LbsDropData copy() { + return new LbsDropData(this); + } } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org For additional commands, e-mail: commits-h...@poi.apache.org