Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderBase.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderBase.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderBase.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderBase.java Sun Dec 22 21:44:45 2019 @@ -21,20 +21,28 @@ import org.apache.poi.ss.util.CellRangeA import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.ss.util.CellRangeUtil; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; /** * Parent of Conditional Formatting Header records, * {@link CFHeaderRecord} and {@link CFHeader12Record}. */ -public abstract class CFHeaderBase extends StandardRecord implements Cloneable { +public abstract class CFHeaderBase extends StandardRecord { private int field_1_numcf; private int field_2_need_recalculation_and_id; private CellRangeAddress field_3_enclosing_cell_range; private CellRangeAddressList field_4_cell_ranges; - /** Creates new CFHeaderBase */ - protected CFHeaderBase() { + protected CFHeaderBase() {} + + protected CFHeaderBase(CFHeaderBase other) { + super(other); + field_1_numcf = other.field_1_numcf; + field_2_need_recalculation_and_id = other.field_2_need_recalculation_and_id; + field_3_enclosing_cell_range = other.field_3_enclosing_cell_range.copy(); + field_4_cell_ranges = other.field_4_cell_ranges.copy(); } + protected CFHeaderBase(CellRangeAddress[] regions, int nRules) { CellRangeAddress[] mergeCellRanges = CellRangeUtil.mergeCellRanges(regions); setCellRanges(mergeCellRanges); @@ -97,7 +105,7 @@ public abstract class CFHeaderBase exten } /** - * Set cell ranges list to a single cell range and + * Set cell ranges list to a single cell range and * modify the enclosing cell range accordingly. * @param cellRanges - list of CellRange objects */ @@ -151,13 +159,12 @@ public abstract class CFHeaderBase exten field_4_cell_ranges.serialize(out); } - protected void copyTo(CFHeaderBase result) { - result.field_1_numcf = field_1_numcf; - result.field_2_need_recalculation_and_id = field_2_need_recalculation_and_id; - result.field_3_enclosing_cell_range = field_3_enclosing_cell_range.copy(); - result.field_4_cell_ranges = field_4_cell_ranges.copy(); - } + @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") + public abstract CFHeaderBase clone(); @Override - public abstract CFHeaderBase clone(); // NOSONAR + public abstract CFHeaderBase copy(); }
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java Sun Dec 22 21:44:45 2019 @@ -18,19 +18,24 @@ package org.apache.poi.hssf.record; import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.util.Removal; /** * Conditional Formatting Header record CFHEADER (0x01B0). * Used to describe a {@link CFRuleRecord}. * @see CFHeader12Record */ -public final class CFHeaderRecord extends CFHeaderBase implements Cloneable { +public final class CFHeaderRecord extends CFHeaderBase { public static final short sid = 0x01B0; - /** Creates new CFHeaderRecord */ public CFHeaderRecord() { createEmpty(); } + + public CFHeaderRecord(CFHeaderRecord other) { + super(other); + } + public CFHeaderRecord(CellRangeAddress[] regions, int nRules) { super(regions, nRules); } @@ -48,9 +53,15 @@ public final class CFHeaderRecord extend } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public CFHeaderRecord clone() { - CFHeaderRecord result = new CFHeaderRecord(); - super.copyTo(result); - return result; + return copy(); + } + + @Override + public CFHeaderRecord copy() { + return new CFHeaderRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java Sun Dec 22 21:44:45 2019 @@ -39,18 +39,19 @@ import org.apache.poi.util.HexDump; import org.apache.poi.util.IOUtils; import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.POILogger; +import org.apache.poi.util.Removal; /** - * Conditional Formatting v12 Rule Record (0x087A). - * + * Conditional Formatting v12 Rule Record (0x087A). + * * <p>This is for newer-style Excel conditional formattings, * from Excel 2007 onwards. - * + * * <p>{@link CFRuleRecord} is used where the condition type is * {@link #CONDITION_TYPE_CELL_VALUE_IS} or {@link #CONDITION_TYPE_FORMULA}, * this is only used for the other types */ -public final class CFRule12Record extends CFRuleBase implements FutureRecord, Cloneable { +public final class CFRule12Record extends CFRuleBase implements FutureRecord { //arbitrarily selected; may need to increase private static final int MAX_RECORD_LENGTH = 100_000; @@ -66,14 +67,35 @@ public final class CFRule12Record extend private int template_type; private byte template_param_length; private byte[] template_params; - + private DataBarFormatting data_bar; private IconMultiStateFormatting multistate; private ColorGradientFormatting color_gradient; // TODO Parse this, see #58150 private byte[] filter_data; - /** Creates new CFRuleRecord */ + public CFRule12Record(CFRule12Record other) { + super(other); + futureHeader = (other.futureHeader == null) ? null : other.futureHeader.copy(); + + // use min() to gracefully handle cases where the length-property and the array-length do not match + // we saw some such files in circulation + ext_formatting_length = Math.min(other.ext_formatting_length, other.ext_formatting_data.length); + ext_formatting_data = other.ext_formatting_data.clone(); + + formula_scale = other.formula_scale.copy(); + + ext_opts = other.ext_opts; + priority = other.priority; + template_type = other.template_type; + template_param_length = other.template_param_length; + template_params = (other.template_params == null) ? null : other.template_params.clone(); + color_gradient = (other.color_gradient == null) ? null : other.color_gradient.copy(); + multistate = (other.multistate == null) ? null : other.multistate.copy(); + data_bar = (other.data_bar == null) ? null : other.data_bar.copy(); + filter_data = (other.filter_data == null) ? null : other.filter_data.clone(); + } + private CFRule12Record(byte conditionType, byte comparisonOperation) { super(conditionType, comparisonOperation); setDefaults(); @@ -84,15 +106,17 @@ public final class CFRule12Record extend setDefaults(); this.formula_scale = Formula.create(formulaScale); } + + private void setDefaults() { futureHeader = new FtrHeader(); futureHeader.setRecordType(sid); - + ext_formatting_length = 0; ext_formatting_data = new byte[4]; - + formula_scale = Formula.create(Ptg.EMPTY_PTG_ARRAY); - + ext_opts = 0; priority = 0; template_type = getConditionType(); @@ -102,10 +126,10 @@ public final class CFRule12Record extend /** * Creates a new comparison operation rule - * + * * @param sheet the sheet * @param formulaText the first formula text - * + * * @return a new comparison operation rule */ public static CFRule12Record create(HSSFSheet sheet, String formulaText) { @@ -113,34 +137,34 @@ public final class CFRule12Record extend return new CFRule12Record(CONDITION_TYPE_FORMULA, ComparisonOperator.NO_COMPARISON, formula1, null, null); } - + /** * Creates a new comparison operation rule - * + * * @param sheet the sheet * @param comparisonOperation the comparison operation * @param formulaText1 the first formula text * @param formulaText2 the second formula text - * + * * @return a new comparison operation rule */ public static CFRule12Record create(HSSFSheet sheet, byte comparisonOperation, String formulaText1, String formulaText2) { Ptg[] formula1 = parseFormula(formulaText1, sheet); Ptg[] formula2 = parseFormula(formulaText2, sheet); - return new CFRule12Record(CONDITION_TYPE_CELL_VALUE_IS, comparisonOperation, + return new CFRule12Record(CONDITION_TYPE_CELL_VALUE_IS, comparisonOperation, formula1, formula2, null); } - + /** * Creates a new comparison operation rule - * + * * @param sheet the sheet * @param comparisonOperation the comparison operation * @param formulaText1 the first formula text * @param formulaText2 the second formula text * @param formulaTextScale the scale to apply for the comparison - * + * * @return a new comparison operation rule */ public static CFRule12Record create(HSSFSheet sheet, byte comparisonOperation, @@ -148,43 +172,43 @@ public final class CFRule12Record extend Ptg[] formula1 = parseFormula(formulaText1, sheet); Ptg[] formula2 = parseFormula(formulaText2, sheet); Ptg[] formula3 = parseFormula(formulaTextScale, sheet); - return new CFRule12Record(CONDITION_TYPE_CELL_VALUE_IS, comparisonOperation, + return new CFRule12Record(CONDITION_TYPE_CELL_VALUE_IS, comparisonOperation, formula1, formula2, formula3); } - + /** * Creates a new Data Bar formatting - * + * * @param sheet the sheet * @param color the data bar color - * + * * @return a new Data Bar formatting */ public static CFRule12Record create(HSSFSheet sheet, ExtendedColor color) { - CFRule12Record r = new CFRule12Record(CONDITION_TYPE_DATA_BAR, + CFRule12Record r = new CFRule12Record(CONDITION_TYPE_DATA_BAR, ComparisonOperator.NO_COMPARISON); DataBarFormatting dbf = r.createDataBarFormatting(); dbf.setColor(color); dbf.setPercentMin((byte)0); dbf.setPercentMax((byte)100); - + DataBarThreshold min = new DataBarThreshold(); min.setType(RangeType.MIN.id); dbf.setThresholdMin(min); - + DataBarThreshold max = new DataBarThreshold(); max.setType(RangeType.MAX.id); dbf.setThresholdMax(max); - + return r; } - + /** * Creates a new Icon Set / Multi-State formatting - * + * * @param sheet the sheet * @param iconSet the icon set - * + * * @return a new Icon Set / Multi-State formatting */ public static CFRule12Record create(HSSFSheet sheet, IconSet iconSet) { @@ -192,20 +216,20 @@ public final class CFRule12Record extend for (int i=0; i<ts.length; i++) { ts[i] = new IconMultiStateThreshold(); } - - CFRule12Record r = new CFRule12Record(CONDITION_TYPE_ICON_SET, + + CFRule12Record r = new CFRule12Record(CONDITION_TYPE_ICON_SET, ComparisonOperator.NO_COMPARISON); IconMultiStateFormatting imf = r.createMultiStateFormatting(); imf.setIconSet(iconSet); imf.setThresholds(ts); return r; } - + /** * Creates a new Color Scale / Color Gradient formatting - * + * * @param sheet the sheet - * + * * @return a new Color Scale / Color Gradient formatting */ public static CFRule12Record createColorScale(HSSFSheet sheet) { @@ -216,8 +240,8 @@ public final class CFRule12Record extend ts[i] = new ColorGradientThreshold(); colors[i] = new ExtendedColor(); } - - CFRule12Record r = new CFRule12Record(CONDITION_TYPE_COLOR_SCALE, + + CFRule12Record r = new CFRule12Record(CONDITION_TYPE_COLOR_SCALE, ComparisonOperator.NO_COMPARISON); ColorGradientFormatting cgf = r.createColorGradientFormatting(); cgf.setNumControlPoints(numPoints); @@ -232,7 +256,7 @@ public final class CFRule12Record extend setComparisonOperation(in.readByte()); int field_3_formula1_len = in.readUShort(); int field_4_formula2_len = in.readUShort(); - + ext_formatting_length = in.readInt(); ext_formatting_data = new byte[0]; if (ext_formatting_length == 0) { @@ -245,13 +269,13 @@ public final class CFRule12Record extend in.readFully(ext_formatting_data); } } - + setFormula1(Formula.read(field_3_formula1_len, in)); setFormula2(Formula.read(field_4_formula2_len, in)); - + int formula_scale_len = in.readUShort(); formula_scale = Formula.read(formula_scale_len, in); - + ext_opts = in.readByte(); priority = in.readUShort(); template_type = in.readUShort(); @@ -263,7 +287,7 @@ public final class CFRule12Record extend logger.log(POILogger.WARN, "CF Rule v12 template params length should be 0 or 16, found " + template_param_length); in.readRemainder(); } - + byte type = getConditionType(); if (type == CONDITION_TYPE_COLOR_SCALE) { color_gradient = new ColorGradientFormatting(in); @@ -275,7 +299,7 @@ public final class CFRule12Record extend multistate = new IconMultiStateFormatting(in); } } - + public boolean containsDataBarBlock() { return (data_bar != null); } @@ -284,7 +308,7 @@ public final class CFRule12Record extend } public DataBarFormatting createDataBarFormatting() { if (data_bar != null) return data_bar; - + // Convert, setup and return setConditionType(CONDITION_TYPE_DATA_BAR); data_bar = new DataBarFormatting(); @@ -299,7 +323,7 @@ public final class CFRule12Record extend } public IconMultiStateFormatting createMultiStateFormatting() { if (multistate != null) return multistate; - + // Convert, setup and return setConditionType(CONDITION_TYPE_ICON_SET); multistate = new IconMultiStateFormatting(); @@ -314,7 +338,7 @@ public final class CFRule12Record extend } public ColorGradientFormatting createColorGradientFormatting() { if (color_gradient != null) return color_gradient; - + // Convert, setup and return setConditionType(CONDITION_TYPE_COLOR_SCALE); color_gradient = new ColorGradientFormatting(); @@ -356,7 +380,7 @@ public final class CFRule12Record extend */ public void serialize(LittleEndianOutput out) { futureHeader.serialize(out); - + int formula1Len=getFormulaSize(getFormula1()); int formula2Len=getFormulaSize(getFormula2()); @@ -364,7 +388,7 @@ public final class CFRule12Record extend out.writeByte(getComparisonOperation()); out.writeShort(formula1Len); out.writeShort(formula2Len); - + // TODO Update ext_formatting_length if (ext_formatting_length == 0) { out.writeInt(0); @@ -374,18 +398,18 @@ public final class CFRule12Record extend serializeFormattingBlock(out); out.write(ext_formatting_data); } - + getFormula1().serializeTokens(out); getFormula2().serializeTokens(out); out.writeShort(getFormulaSize(formula_scale)); formula_scale.serializeTokens(out); - + out.writeByte(ext_opts); out.writeShort(priority); out.writeShort(template_type); out.writeByte(template_param_length); out.write(template_params); - + byte type = getConditionType(); if (type == CONDITION_TYPE_COLOR_SCALE) { color_gradient.serialize(out); @@ -409,7 +433,7 @@ public final class CFRule12Record extend len += getFormulaSize(getFormula2()); len += 2 + getFormulaSize(formula_scale); len += 6 + template_params.length; - + byte type = getConditionType(); if (type == CONDITION_TYPE_COLOR_SCALE) { len += color_gradient.getDataLength(); @@ -461,44 +485,18 @@ public final class CFRule12Record extend } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public CFRule12Record clone() { - CFRule12Record rec = new CFRule12Record(getConditionType(), getComparisonOperation()); - rec.futureHeader.setAssociatedRange(futureHeader.getAssociatedRange().copy()); - - super.copyTo(rec); - - // use min() to gracefully handle cases where the length-property and the array-length do not match - // we saw some such files in circulation - rec.ext_formatting_length = Math.min(ext_formatting_length, ext_formatting_data.length); - rec.ext_formatting_data = IOUtils.safelyAllocate(ext_formatting_length, MAX_RECORD_LENGTH); - System.arraycopy(ext_formatting_data, 0, rec.ext_formatting_data, 0, rec.ext_formatting_length); - - rec.formula_scale = formula_scale.copy(); - - rec.ext_opts = ext_opts; - rec.priority = priority; - rec.template_type = template_type; - rec.template_param_length = template_param_length; - rec.template_params = IOUtils.safelyAllocate(template_param_length, MAX_RECORD_LENGTH); - System.arraycopy(template_params, 0, rec.template_params, 0, template_param_length); + return copy(); + } - if (color_gradient != null) { - rec.color_gradient = (ColorGradientFormatting)color_gradient.clone(); - } - if (multistate != null) { - rec.multistate = (IconMultiStateFormatting)multistate.clone(); - } - if (data_bar != null) { - rec.data_bar = (DataBarFormatting)data_bar.clone(); - } - if (filter_data != null) { - rec.filter_data = IOUtils.safelyAllocate(filter_data.length, MAX_RECORD_LENGTH); - System.arraycopy(filter_data, 0, rec.filter_data, 0, filter_data.length); - } - - return rec; + @Override + public CFRule12Record copy() { + return new CFRule12Record(this); } - + public short getFutureRecordType() { return futureHeader.getRecordType(); } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java Sun Dec 22 21:44:45 2019 @@ -30,32 +30,31 @@ import org.apache.poi.util.BitFieldFacto import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; +import org.apache.poi.util.Removal; /** * Conditional Formatting Rules. This can hold old-style rules - * - * + * + * * <p>This is for the older-style Excel conditional formattings, * new-style (Excel 2007+) also make use of {@link CFRule12Record} * for their rules.</p> */ -public abstract class CFRuleBase extends StandardRecord implements Cloneable { +public abstract class CFRuleBase extends StandardRecord { // FIXME: Merge with org.apache.poi.ss.usermodel.ComparisonOperator and rewrite as an enum - public static final class ComparisonOperator { - public static final byte NO_COMPARISON = 0; - public static final byte BETWEEN = 1; - public static final byte NOT_BETWEEN = 2; - public static final byte EQUAL = 3; - public static final byte NOT_EQUAL = 4; - public static final byte GT = 5; - public static final byte LT = 6; - public static final byte GE = 7; - public static final byte LE = 8; - private static final byte max_operator = 8; + public interface ComparisonOperator { + byte NO_COMPARISON = 0; + byte BETWEEN = 1; + byte NOT_BETWEEN = 2; + byte EQUAL = 3; + byte NOT_EQUAL = 4; + byte GT = 5; + byte LT = 6; + byte GE = 7; + byte LE = 8; + byte max_operator = 8; } - protected static final POILogger logger = POILogFactory.getLogger(CFRuleBase.class); - private byte condition_type; // The only kinds that CFRuleRecord handles public static final byte CONDITION_TYPE_CELL_VALUE_IS = 1; public static final byte CONDITION_TYPE_FORMULA = 2; @@ -65,8 +64,6 @@ public abstract class CFRuleBase extends public static final byte CONDITION_TYPE_FILTER = 5; public static final byte CONDITION_TYPE_ICON_SET = 6; - private byte comparison_operator; - public static final int TEMPLATE_CELL_VALUE = 0x0000; public static final int TEMPLATE_FORMULA = 0x0001; public static final int TEMPLATE_COLOR_SCALE_FORMATTING = 0x0002; @@ -94,7 +91,9 @@ public abstract class CFRuleBase extends public static final int TEMPLATE_DUPLICATE_VALUES = 0x001B; public static final int TEMPLATE_ABOVE_OR_EQUAL_TO_AVERAGE = 0x001D; public static final int TEMPLATE_BELOW_OR_EQUAL_TO_AVERAGE = 0x001E; - + + protected static final POILogger logger = POILogFactory.getLogger(CFRuleBase.class); + static final BitField modificationBits = bf(0x003FFFFF); // Bits: font,align,bord,patt,prot static final BitField alignHor = bf(0x00000001); // 0 = Horizontal alignment modified static final BitField alignVer = bf(0x00000002); // 0 = Vertical alignment modified @@ -129,19 +128,24 @@ public abstract class CFRuleBase extends return BitFieldFactory.getInstance(i); } + + private byte condition_type; + private byte comparison_operator; + protected int formatting_options; - protected short formatting_not_used; // TODO Decode this properly + // TODO Decode this properly + protected short formatting_not_used; protected FontFormatting _fontFormatting; protected BorderFormatting _borderFormatting; protected PatternFormatting _patternFormatting; - + private Formula formula1; private Formula formula2; /** * Creates new CFRuleRecord - * + * * @param conditionType the condition type * @param comparisonOperation the comparison operation */ @@ -151,19 +155,34 @@ public abstract class CFRuleBase extends formula1 = Formula.create(Ptg.EMPTY_PTG_ARRAY); formula2 = Formula.create(Ptg.EMPTY_PTG_ARRAY); } + protected CFRuleBase(byte conditionType, byte comparisonOperation, Ptg[] formula1, Ptg[] formula2) { this(conditionType, comparisonOperation); this.formula1 = Formula.create(formula1); this.formula2 = Formula.create(formula2); } + protected CFRuleBase() {} - + + protected CFRuleBase(CFRuleBase other) { + super(other); + setConditionType(other.getConditionType()); + setComparisonOperation(other.getComparisonOperation()); + formatting_options = other.formatting_options; + formatting_not_used = other.formatting_not_used; + _fontFormatting = (!other.containsFontFormattingBlock()) ? null : other.getFontFormatting().copy(); + _borderFormatting = (!other.containsBorderFormattingBlock()) ? null : other.getBorderFormatting().copy(); + _patternFormatting = (!other.containsPatternFormattingBlock()) ? null : other.getPatternFormatting().copy(); + formula1 = other.getFormula1().copy(); + formula2 = other.getFormula2().copy(); + } + protected int readFormatOptions(RecordInputStream in) { formatting_options = in.readInt(); formatting_not_used = in.readShort(); int len = 6; - + if (containsFontFormattingBlock()) { _fontFormatting = new FontFormatting(in); len += _fontFormatting.getDataLength(); @@ -178,7 +197,7 @@ public abstract class CFRuleBase extends _patternFormatting = new PatternFormatting(in); len += _patternFormatting.getDataLength(); } - + return len; } @@ -187,10 +206,8 @@ public abstract class CFRuleBase extends } protected void setConditionType(byte condition_type) { if ((this instanceof CFRuleRecord)) { - if (condition_type == CONDITION_TYPE_CELL_VALUE_IS || - condition_type == CONDITION_TYPE_FORMULA) { - // Good, valid combination - } else { + if (!(condition_type == CONDITION_TYPE_CELL_VALUE_IS || + condition_type == CONDITION_TYPE_FORMULA)) { throw new IllegalArgumentException("CFRuleRecord only accepts Value-Is and Formula types"); } } @@ -201,7 +218,7 @@ public abstract class CFRuleBase extends if (operation < 0 || operation > ComparisonOperator.max_operator) throw new IllegalArgumentException( "Valid operators are only in the range 0 to " +ComparisonOperator.max_operator); - + this.comparison_operator = operation; } public byte getComparisonOperation() { @@ -351,7 +368,7 @@ public abstract class CFRuleBase extends private void setOptionFlag(boolean flag, BitField field) { formatting_options = field.setBoolean(formatting_options, flag); } - + protected int getFormattingBlockSize() { return 6 + (containsFontFormattingBlock()?_fontFormatting.getRawRecord().length:0)+ @@ -375,7 +392,7 @@ public abstract class CFRuleBase extends _patternFormatting.serialize(out); } } - + /** * get the stack of the 1st expression as a list * @@ -440,27 +457,13 @@ public abstract class CFRuleBase extends int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet); return HSSFFormulaParser.parse(formula, sheet.getWorkbook(), FormulaType.CELL, sheetIndex); } - - protected void copyTo(CFRuleBase rec) { - rec.condition_type = condition_type; - rec.comparison_operator = comparison_operator; - - rec.formatting_options = formatting_options; - rec.formatting_not_used = formatting_not_used; - if (containsFontFormattingBlock()) { - rec._fontFormatting = _fontFormatting.clone(); - } - if (containsBorderFormattingBlock()) { - rec._borderFormatting = _borderFormatting.clone(); - } - if (containsPatternFormattingBlock()) { - rec._patternFormatting = (PatternFormatting) _patternFormatting.clone(); - } - - rec.setFormula1(getFormula1().copy()); - rec.setFormula2(getFormula2().copy()); - } - + @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public abstract CFRuleBase clone(); + + @Override + public abstract CFRuleBase copy(); } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java Sun Dec 22 21:44:45 2019 @@ -23,18 +23,22 @@ import org.apache.poi.hssf.usermodel.HSS import org.apache.poi.ss.formula.Formula; import org.apache.poi.ss.formula.ptg.Ptg; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; /** - * Conditional Formatting Rule Record (0x01B1). - * + * Conditional Formatting Rule Record (0x01B1). + * * <p>This is for the older-style Excel conditional formattings, * new-style (Excel 2007+) also make use of {@link CFRule12Record} * for their rules.</p> */ -public final class CFRuleRecord extends CFRuleBase implements Cloneable { +public final class CFRuleRecord extends CFRuleBase { public static final short sid = 0x01B1; - /** Creates new CFRuleRecord */ + public CFRuleRecord(CFRuleRecord other) { + super(other); + } + private CFRuleRecord(byte conditionType, byte comparisonOperation) { super(conditionType, comparisonOperation); setDefaults(); @@ -59,10 +63,10 @@ public final class CFRuleRecord extends /** * Creates a new comparison operation rule - * + * * @param sheet the sheet * @param formulaText the formula text - * + * * @return a new comparison operation rule */ public static CFRuleRecord create(HSSFSheet sheet, String formulaText) { @@ -72,12 +76,12 @@ public final class CFRuleRecord extends } /** * Creates a new comparison operation rule - * + * * @param sheet the sheet * @param comparisonOperation the comparison operation * @param formulaText1 the first formula text * @param formulaText2 the second formula text - * + * * @return a new comparison operation rule */ public static CFRuleRecord create(HSSFSheet sheet, byte comparisonOperation, @@ -120,7 +124,7 @@ public final class CFRuleRecord extends out.writeByte(getComparisonOperation()); out.writeShort(formula1Len); out.writeShort(formula2Len); - + serializeFormattingBlock(out); getFormula1().serializeTokens(out); @@ -156,9 +160,15 @@ public final class CFRuleRecord extends } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public CFRuleRecord clone() { - CFRuleRecord rec = new CFRuleRecord(getConditionType(), getComparisonOperation()); - super.copyTo(rec); - return rec; + return copy(); + } + + @Override + public CFRuleRecord copy() { + return new CFRuleRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CRNCountRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CRNCountRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CRNCountRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CRNCountRecord.java Sun Dec 22 21:44:45 2019 @@ -19,30 +19,26 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndianOutput; /** - * XCT - CRN Count <P> - * - * REFERENCE: 5.114<P> - * - * @author Josh Micich + * XCT - CRN Count */ public final class CRNCountRecord extends StandardRecord { - public final static short sid = 0x59; + public static final short sid = 0x59; private static final short DATA_SIZE = 4; + private int field_1_number_crn_records; + private int field_2_sheet_table_index; - private int field_1_number_crn_records; - private int field_2_sheet_table_index; - - public CRNCountRecord() { - throw new RuntimeException("incomplete code"); + private CRNCountRecord() { + // incomplete code } - public int getNumberOfCRNs() { - return field_1_number_crn_records; + public CRNCountRecord(CRNCountRecord other) { + super(other); + field_1_number_crn_records = other.field_1_number_crn_records; + field_2_sheet_table_index = other.field_2_sheet_table_index; } - public CRNCountRecord(RecordInputStream in) { field_1_number_crn_records = in.readShort(); if(field_1_number_crn_records < 0) { @@ -53,6 +49,9 @@ public final class CRNCountRecord extend field_2_sheet_table_index = in.readShort(); } + public int getNumberOfCRNs() { + return field_1_number_crn_records; + } public String toString() { StringBuilder sb = new StringBuilder(); @@ -77,4 +76,9 @@ public final class CRNCountRecord extend public short getSid() { return sid; } + + @Override + public CRNCountRecord copy() { + return new CRNCountRecord(this); + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CRNRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CRNRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CRNRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CRNRecord.java Sun Dec 22 21:44:45 2019 @@ -21,27 +21,30 @@ import org.apache.poi.ss.formula.constan import org.apache.poi.util.LittleEndianOutput; /** - * Title: CRN(0x005A)<p> - * Description: This record stores the contents of an external cell or cell range<p> - * REFERENCE: OOO 5.23 + * This record stores the contents of an external cell or cell range */ public final class CRNRecord extends StandardRecord { - public final static short sid = 0x005A; + public static final short sid = 0x005A; - private int field_1_last_column_index; - private int field_2_first_column_index; - private int field_3_row_index; + private int field_1_last_column_index; + private int field_2_first_column_index; + private int field_3_row_index; private Object[] field_4_constant_values; - public CRNRecord() { - throw new RuntimeException("incomplete code"); + private CRNRecord() { + // incomplete code } - public int getNumberOfCRNs() { - return field_1_last_column_index; + public CRNRecord(CRNRecord other) { + super(other); + field_1_last_column_index = other.field_1_last_column_index; + field_2_first_column_index = other.field_2_first_column_index; + field_3_row_index = other.field_3_row_index; + // field_4_constant_values are instances of Double, Boolean, String, ErrorCode, + // i.e. they are immutable and can their references can be simply cloned + field_4_constant_values = (other.field_4_constant_values == null) ? null : other.field_4_constant_values.clone(); } - public CRNRecord(RecordInputStream in) { field_1_last_column_index = in.readUByte(); field_2_first_column_index = in.readUByte(); @@ -50,6 +53,9 @@ public final class CRNRecord extends Sta field_4_constant_values = ConstantValueParser.parse(in, nValues); } + public int getNumberOfCRNs() { + return field_1_last_column_index; + } public String toString() { StringBuilder sb = new StringBuilder(); @@ -77,4 +83,9 @@ public final class CRNRecord extends Sta public short getSid() { return sid; } + + @Override + public CRNRecord copy() { + return new CRNRecord(this); + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CalcCountRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CalcCountRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CalcCountRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CalcCountRecord.java Sun Dec 22 21:44:45 2019 @@ -15,34 +15,37 @@ 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: Calc Count Record - * Description: Specifies the maximum times the gui should perform a formula - * recalculation. For instance: in the case a formula includes - * cells that are themselves a result of a formula and a value - * changes. This is essentially a failsafe against an infinate - * loop in the event the formulas are not independant. <P> - * REFERENCE: PG 292 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> + * Specifies the maximum times the gui should perform a formula recalculation. + * For instance: in the case a formula includes cells that are themselves a result of a formula and + * a value changes. This is essentially a failsafe against an infinite loop in the event the formulas + * are not independent. + * * @version 2.0-pre - * @see org.apache.poi.hssf.record.CalcModeRecord + * @see CalcModeRecord */ -public final class CalcCountRecord extends StandardRecord implements Cloneable { - public final static short sid = 0xC; - private short field_1_iterations; +public final class CalcCountRecord extends StandardRecord { + public static final short sid = 0xC; - public CalcCountRecord() - { + private short field_1_iterations; + + public CalcCountRecord() {} + + public CalcCountRecord(CalcCountRecord other) { + super(other); + field_1_iterations = other.field_1_iterations; } - public CalcCountRecord(RecordInputStream in) - { + + public CalcCountRecord(RecordInputStream in) { field_1_iterations = in.readShort(); } @@ -91,9 +94,15 @@ public final class CalcCountRecord exten } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public CalcCountRecord clone() { - CalcCountRecord rec = new CalcCountRecord(); - rec.field_1_iterations = field_1_iterations; - return rec; + return copy(); + } + + @Override + public CalcCountRecord copy() { + return new CalcCountRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CalcModeRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CalcModeRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CalcModeRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CalcModeRecord.java Sun Dec 22 21:44:45 2019 @@ -15,52 +15,42 @@ 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: Calc Mode Record<P> - * Description: Tells the gui whether to calculate formulas - * automatically, manually or automatically - * except for tables.<P> - * REFERENCE: PG 292 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) + * Tells the gui whether to calculate formulas automatically, manually or automatically except for tables. + * * @version 2.0-pre - * @see org.apache.poi.hssf.record.CalcCountRecord + * @see CalcCountRecord */ -public final class CalcModeRecord extends StandardRecord implements Cloneable { - public final static short sid = 0xD; +public final class CalcModeRecord extends StandardRecord { + public static final short sid = 0xD; - /** - * manually calculate formulas (0) - */ + /** manually calculate formulas (0) */ + public static final short MANUAL = 0; - public final static short MANUAL = 0; + /** automatically calculate formulas (1) */ + public static final short AUTOMATIC = 1; - /** - * automatically calculate formulas (1) - */ + /** automatically calculate formulas except for tables (-1) */ + public static final short AUTOMATIC_EXCEPT_TABLES = -1; - public final static short AUTOMATIC = 1; + private short field_1_calcmode; - /** - * automatically calculate formulas except for tables (-1) - */ + public CalcModeRecord() {} - public final static short AUTOMATIC_EXCEPT_TABLES = -1; - private short field_1_calcmode; - - public CalcModeRecord() - { + public CalcModeRecord(CalcModeRecord other) { + super(other); + field_1_calcmode = other.field_1_calcmode; } - public CalcModeRecord(RecordInputStream in) - { + public CalcModeRecord(RecordInputStream in) { field_1_calcmode = in.readShort(); } @@ -119,9 +109,15 @@ public final class CalcModeRecord extend } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public CalcModeRecord clone() { - CalcModeRecord rec = new CalcModeRecord(); - rec.field_1_calcmode = field_1_calcmode; - return rec; + return copy(); + } + + @Override + public CalcModeRecord copy() { + return new CalcModeRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CellRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CellRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CellRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CellRecord.java Sun Dec 22 21:44:45 2019 @@ -29,8 +29,13 @@ public abstract class CellRecord extends private int _columnIndex; private int _formatIndex; - protected CellRecord() { - // fields uninitialised + protected CellRecord() {} + + protected CellRecord(CellRecord other) { + super(other); + _rowIndex = other.getRow(); + _columnIndex = other.getColumn(); + _formatIndex = other.getXFIndex(); } protected CellRecord(RecordInputStream in) { @@ -100,21 +105,21 @@ public abstract class CellRecord extends * Append specific debug info (used by {@link #toString()} for the value * contained in this record. Trailing new-line should not be appended * (superclass does that). - * + * * @param sb the StringBuilder to write to */ protected abstract void appendValueText(StringBuilder sb); /** * Gets the debug info BIFF record type name (used by {@link #toString()}. - * + * * @return the record type name */ protected abstract String getRecordName(); /** * writes out the value data for this cell record - * + * * @param out the output */ protected abstract void serializeValue(LittleEndianOutput out); @@ -137,9 +142,6 @@ public abstract class CellRecord extends return 6 + getValueDataSize(); } - protected final void copyBaseFields(CellRecord rec) { - rec._rowIndex = _rowIndex; - rec._columnIndex = _columnIndex; - rec._formatIndex = _formatIndex; - } + @Override + public abstract CellRecord copy(); } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CodepageRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CodepageRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CodepageRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CodepageRecord.java Sun Dec 22 21:44:45 2019 @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - + package org.apache.poi.hssf.record; @@ -23,33 +23,33 @@ import org.apache.poi.util.CodePageUtil; import org.apache.poi.util.LittleEndianOutput; /** - * Title: Codepage Record - * <p>Description: the default characterset. for the workbook</p> - * <p>REFERENCE: PG 293 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)</p> - * <p>Use {@link CodePageUtil} to turn these values into Java code pages - * to encode/decode strings.</p> + * The default characterset. for the workbook<p> + * + * Use {@link CodePageUtil} to turn these values into Java code pages to encode/decode strings. + * * @version 2.0-pre */ -public final class CodepageRecord - extends StandardRecord -{ - public final static short sid = 0x42; - private short field_1_codepage; // = 0; +public final class CodepageRecord extends StandardRecord { + public static final short sid = 0x42; /** * Excel 97+ (Biff 8) should always store strings as UTF-16LE or * compressed versions of that. As such, this should always be * 0x4b0 = UTF_16, except for files coming from older versions. */ - public final static short CODEPAGE = ( short ) 0x4b0; + public static final short CODEPAGE = ( short ) 0x4b0; - public CodepageRecord() - { + private short field_1_codepage; + + public CodepageRecord() {} + + public CodepageRecord(CodepageRecord other) { + super(other); + field_1_codepage = other.field_1_codepage; } - public CodepageRecord(RecordInputStream in) - { + public CodepageRecord(RecordInputStream in) { field_1_codepage = in.readShort(); } @@ -100,4 +100,9 @@ public final class CodepageRecord { return sid; } + + @Override + public CodepageRecord copy() { + return new CodepageRecord(this); + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/ColumnInfoRecord.java Sun Dec 22 21:44:45 2019 @@ -17,27 +17,27 @@ package org.apache.poi.hssf.record; -import org.apache.poi.util.HexDump; -import org.apache.poi.util.LittleEndianOutput; 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: COLINFO Record (0x007D)<p> - * Description: Defines with width and formatting for a range of columns<p> - * REFERENCE: PG 293 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) + * Defines with width and formatting for a range of columns */ -public final class ColumnInfoRecord extends StandardRecord implements Cloneable { +public final class ColumnInfoRecord extends StandardRecord { public static final short sid = 0x007D; + private static final BitField hidden = BitFieldFactory.getInstance(0x01); + private static final BitField outlevel = BitFieldFactory.getInstance(0x0700); + private static final BitField collapsed = BitFieldFactory.getInstance(0x1000); + private int _firstCol; private int _lastCol; private int _colWidth; private int _xfIndex; private int _options; - private static final BitField hidden = BitFieldFactory.getInstance(0x01); - private static final BitField outlevel = BitFieldFactory.getInstance(0x0700); - private static final BitField collapsed = BitFieldFactory.getInstance(0x1000); // Excel seems write values 2, 10, and 260, even though spec says "must be zero" private int field_6_reserved; @@ -51,6 +51,16 @@ public final class ColumnInfoRecord exte field_6_reserved = 2; // seems to be the most common value } + public ColumnInfoRecord(ColumnInfoRecord other) { + super(other); + _firstCol = other._firstCol; + _lastCol = other._lastCol; + _colWidth = other._colWidth; + _xfIndex = other._xfIndex; + _options = other._options; + field_6_reserved = other.field_6_reserved; + } + public ColumnInfoRecord(RecordInputStream in) { _firstCol = in.readUShort(); _lastCol = in.readUShort(); @@ -196,7 +206,7 @@ public final class ColumnInfoRecord exte /** * @param other the format to match with - * + * * @return {@code true} if the format, options and column width match */ public boolean formatMatches(ColumnInfoRecord other) { @@ -246,14 +256,15 @@ public final class ColumnInfoRecord exte } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public ColumnInfoRecord clone() { - ColumnInfoRecord rec = new ColumnInfoRecord(); - rec._firstCol = _firstCol; - rec._lastCol = _lastCol; - rec._colWidth = _colWidth; - rec._xfIndex = _xfIndex; - rec._options = _options; - rec.field_6_reserved = field_6_reserved; - return rec; + return copy(); + } + + @Override + public ColumnInfoRecord copy() { + return new ColumnInfoRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CommonObjectDataSubRecord.java Sun Dec 22 21:44:45 2019 @@ -23,50 +23,51 @@ 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 common object data record is used to store all common preferences for an excel object. */ -public final class CommonObjectDataSubRecord extends SubRecord implements Cloneable { - public final static short sid = 0x0015; +public final class CommonObjectDataSubRecord extends SubRecord { + public static final short sid = 0x0015; private static final BitField locked = BitFieldFactory.getInstance(0x0001); private static final BitField printable = BitFieldFactory.getInstance(0x0010); private static final BitField autofill = BitFieldFactory.getInstance(0x2000); private static final BitField autoline = BitFieldFactory.getInstance(0x4000); - public final static short OBJECT_TYPE_GROUP = 0; - public final static short OBJECT_TYPE_LINE = 1; - public final static short OBJECT_TYPE_RECTANGLE = 2; - public final static short OBJECT_TYPE_OVAL = 3; - public final static short OBJECT_TYPE_ARC = 4; - public final static short OBJECT_TYPE_CHART = 5; - public final static short OBJECT_TYPE_TEXT = 6; - public final static short OBJECT_TYPE_BUTTON = 7; - public final static short OBJECT_TYPE_PICTURE = 8; - public final static short OBJECT_TYPE_POLYGON = 9; - public final static short OBJECT_TYPE_RESERVED1 = 10; - public final static short OBJECT_TYPE_CHECKBOX = 11; - public final static short OBJECT_TYPE_OPTION_BUTTON = 12; - public final static short OBJECT_TYPE_EDIT_BOX = 13; - public final static short OBJECT_TYPE_LABEL = 14; - public final static short OBJECT_TYPE_DIALOG_BOX = 15; - public final static short OBJECT_TYPE_SPINNER = 16; - public final static short OBJECT_TYPE_SCROLL_BAR = 17; - public final static short OBJECT_TYPE_LIST_BOX = 18; - public final static short OBJECT_TYPE_GROUP_BOX = 19; - public final static short OBJECT_TYPE_COMBO_BOX = 20; - public final static short OBJECT_TYPE_RESERVED2 = 21; - public final static short OBJECT_TYPE_RESERVED3 = 22; - public final static short OBJECT_TYPE_RESERVED4 = 23; - public final static short OBJECT_TYPE_RESERVED5 = 24; - public final static short OBJECT_TYPE_COMMENT = 25; - public final static short OBJECT_TYPE_RESERVED6 = 26; - public final static short OBJECT_TYPE_RESERVED7 = 27; - public final static short OBJECT_TYPE_RESERVED8 = 28; - public final static short OBJECT_TYPE_RESERVED9 = 29; - public final static short OBJECT_TYPE_MICROSOFT_OFFICE_DRAWING = 30; - + public static final short OBJECT_TYPE_GROUP = 0; + public static final short OBJECT_TYPE_LINE = 1; + public static final short OBJECT_TYPE_RECTANGLE = 2; + public static final short OBJECT_TYPE_OVAL = 3; + public static final short OBJECT_TYPE_ARC = 4; + public static final short OBJECT_TYPE_CHART = 5; + public static final short OBJECT_TYPE_TEXT = 6; + public static final short OBJECT_TYPE_BUTTON = 7; + public static final short OBJECT_TYPE_PICTURE = 8; + public static final short OBJECT_TYPE_POLYGON = 9; + public static final short OBJECT_TYPE_RESERVED1 = 10; + public static final short OBJECT_TYPE_CHECKBOX = 11; + public static final short OBJECT_TYPE_OPTION_BUTTON = 12; + public static final short OBJECT_TYPE_EDIT_BOX = 13; + public static final short OBJECT_TYPE_LABEL = 14; + public static final short OBJECT_TYPE_DIALOG_BOX = 15; + public static final short OBJECT_TYPE_SPINNER = 16; + public static final short OBJECT_TYPE_SCROLL_BAR = 17; + public static final short OBJECT_TYPE_LIST_BOX = 18; + public static final short OBJECT_TYPE_GROUP_BOX = 19; + public static final short OBJECT_TYPE_COMBO_BOX = 20; + public static final short OBJECT_TYPE_RESERVED2 = 21; + public static final short OBJECT_TYPE_RESERVED3 = 22; + public static final short OBJECT_TYPE_RESERVED4 = 23; + public static final short OBJECT_TYPE_RESERVED5 = 24; + public static final short OBJECT_TYPE_COMMENT = 25; + public static final short OBJECT_TYPE_RESERVED6 = 26; + public static final short OBJECT_TYPE_RESERVED7 = 27; + public static final short OBJECT_TYPE_RESERVED8 = 28; + public static final short OBJECT_TYPE_RESERVED9 = 29; + public static final short OBJECT_TYPE_MICROSOFT_OFFICE_DRAWING = 30; + private short field_1_objectType; private int field_2_objectId; private short field_3_option; @@ -75,9 +76,16 @@ public final class CommonObjectDataSubRe private int field_6_reserved3; - public CommonObjectDataSubRecord() - { + public CommonObjectDataSubRecord() {} + public CommonObjectDataSubRecord(CommonObjectDataSubRecord other) { + super(other); + field_1_objectType = other.field_1_objectType; + field_2_objectId = other.field_2_objectId; + field_3_option = other.field_3_option; + field_4_reserved1 = other.field_4_reserved1; + field_5_reserved2 = other.field_5_reserved2; + field_6_reserved3 = other.field_6_reserved3; } public CommonObjectDataSubRecord(LittleEndianInput in, int size) { @@ -101,31 +109,31 @@ public final class CommonObjectDataSubRe buffer.append(" .objectType = ") .append("0x").append(HexDump.toHex( getObjectType ())) .append(" (").append( getObjectType() ).append(" )"); - buffer.append(System.getProperty("line.separator")); + buffer.append(System.getProperty("line.separator")); buffer.append(" .objectId = ") .append("0x").append(HexDump.toHex( getObjectId ())) .append(" (").append( getObjectId() ).append(" )"); - buffer.append(System.getProperty("line.separator")); + buffer.append(System.getProperty("line.separator")); buffer.append(" .option = ") .append("0x").append(HexDump.toHex( getOption ())) .append(" (").append( getOption() ).append(" )"); - buffer.append(System.getProperty("line.separator")); - buffer.append(" .locked = ").append(isLocked()).append('\n'); - buffer.append(" .printable = ").append(isPrintable()).append('\n'); - buffer.append(" .autofill = ").append(isAutofill()).append('\n'); - buffer.append(" .autoline = ").append(isAutoline()).append('\n'); + buffer.append(System.getProperty("line.separator")); + buffer.append(" .locked = ").append(isLocked()).append('\n'); + buffer.append(" .printable = ").append(isPrintable()).append('\n'); + buffer.append(" .autofill = ").append(isAutofill()).append('\n'); + buffer.append(" .autoline = ").append(isAutoline()).append('\n'); buffer.append(" .reserved1 = ") .append("0x").append(HexDump.toHex( getReserved1 ())) .append(" (").append( getReserved1() ).append(" )"); - buffer.append(System.getProperty("line.separator")); + buffer.append(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(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(System.getProperty("line.separator")); buffer.append("[/ftCmo]\n"); return buffer.toString(); @@ -159,23 +167,23 @@ public final class CommonObjectDataSubRe } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public CommonObjectDataSubRecord clone() { - CommonObjectDataSubRecord rec = new CommonObjectDataSubRecord(); - - rec.field_1_objectType = field_1_objectType; - rec.field_2_objectId = field_2_objectId; - rec.field_3_option = field_3_option; - rec.field_4_reserved1 = field_4_reserved1; - rec.field_5_reserved2 = field_5_reserved2; - rec.field_6_reserved3 = field_6_reserved3; - return rec; + return copy(); + } + + @Override + public CommonObjectDataSubRecord copy() { + return new CommonObjectDataSubRecord(this); } /** * Get the object type field for the CommonObjectData record. * - * @return One of + * @return One of * OBJECT_TYPE_GROUP * OBJECT_TYPE_LINE * OBJECT_TYPE_RECTANGLE @@ -217,7 +225,7 @@ public final class CommonObjectDataSubRe * Set the object type field for the CommonObjectData record. * * @param field_1_objectType - * One of + * One of * OBJECT_TYPE_GROUP * OBJECT_TYPE_LINE * OBJECT_TYPE_RECTANGLE @@ -257,7 +265,7 @@ public final class CommonObjectDataSubRe /** * Get the object id field for the CommonObjectData record. - * + * * @return the object id field */ public int getObjectId() @@ -267,7 +275,7 @@ public final class CommonObjectDataSubRe /** * Set the object id field for the CommonObjectData record. - * + * * @param field_2_objectId the object id field */ public void setObjectId(int field_2_objectId) @@ -277,7 +285,7 @@ public final class CommonObjectDataSubRe /** * Get the option field for the CommonObjectData record. - * + * * @return the option field */ public short getOption() @@ -287,7 +295,7 @@ public final class CommonObjectDataSubRe /** * Set the option field for the CommonObjectData record. - * + * * @param field_3_option the option field */ public void setOption(short field_3_option) @@ -297,7 +305,7 @@ public final class CommonObjectDataSubRe /** * Get the reserved1 field for the CommonObjectData record. - * + * * @return the reserved1 field */ public int getReserved1() @@ -307,7 +315,7 @@ public final class CommonObjectDataSubRe /** * Set the reserved1 field for the CommonObjectData record. - * + * * @param field_4_reserved1 the reserved1 field */ public void setReserved1(int field_4_reserved1) @@ -317,7 +325,7 @@ public final class CommonObjectDataSubRe /** * Get the reserved2 field for the CommonObjectData record. - * + * * @return the reserved2 field */ public int getReserved2() @@ -327,7 +335,7 @@ public final class CommonObjectDataSubRe /** * Set the reserved2 field for the CommonObjectData record. - * + * * @param field_5_reserved2 the reserved2 field */ public void setReserved2(int field_5_reserved2) @@ -337,7 +345,7 @@ public final class CommonObjectDataSubRe /** * Get the reserved3 field for the CommonObjectData record. - * + * * @return the reserved3 field */ public int getReserved3() @@ -347,7 +355,7 @@ public final class CommonObjectDataSubRe /** * Set the reserved3 field for the CommonObjectData record. - * + * * @param field_6_reserved3 the reserved3 field */ public void setReserved3(int field_6_reserved3) @@ -358,7 +366,7 @@ public final class CommonObjectDataSubRe /** * Sets the locked field value. * true if object is locked when sheet has been protected - * + * * @param value {@code true} if object is locked when sheet has been protected */ public void setLocked(boolean value) @@ -378,7 +386,7 @@ public final class CommonObjectDataSubRe /** * Sets the printable field value. * object appears when printed - * + * * @param value {@code true} if object appears when printed */ public void setPrintable(boolean value) @@ -398,7 +406,7 @@ public final class CommonObjectDataSubRe /** * Sets the autofill field value. * whether object uses an automatic fill style - * + * * @param value {@code true} if object uses an automatic fill style */ public void setAutofill(boolean value) @@ -418,7 +426,7 @@ public final class CommonObjectDataSubRe /** * Sets the autoline field value. * whether object uses an automatic line style - * + * * @param value {@code true} if object uses an automatic line style */ public void setAutoline(boolean value) Modified: poi/trunk/src/java/org/apache/poi/hssf/record/ContinueRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/ContinueRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/ContinueRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/ContinueRecord.java Sun Dec 22 21:44:45 2019 @@ -19,23 +19,26 @@ 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: Continue Record(0x003C) - Helper class used primarily for SST Records <P> - * Description: handles overflow for prior record in the input - * stream; content is tailored to that prior record<P> - * @author Marc Johnson (mjohnson at apache dot org) - * @author Andrew C. Oliver (acoliver at apache dot org) - * @author Csaba Nagy (ncsaba at yahoo dot com) + * Helper class used primarily for SST Records<p> + * + * handles overflow for prior record in the input stream; content is tailored to that prior record */ -public final class ContinueRecord extends StandardRecord implements Cloneable { - public final static short sid = 0x003C; +public final class ContinueRecord extends StandardRecord { + public static final short sid = 0x003C; private byte[] _data; public ContinueRecord(byte[] data) { _data = data; } + public ContinueRecord(ContinueRecord other) { + super(other); + _data = (other._data == null) ? null : other._data.clone(); + } + protected int getDataSize() { return _data.length; } @@ -70,7 +73,15 @@ public final class ContinueRecord extend } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public ContinueRecord clone() { - return new ContinueRecord(_data); + return copy(); + } + + @Override + public ContinueRecord copy() { + return new ContinueRecord(this); } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CountryRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CountryRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/CountryRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/CountryRecord.java Sun Dec 22 21:44:45 2019 @@ -15,37 +15,36 @@ 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: Country Record (aka WIN.INI country)<P> - * Description: used for localization. Currently HSSF always sets this to 1 - * and it seems to work fine even in Germany. (es geht's auch fuer Deutschland)<P> + * Country Record (aka WIN.INI country) - used for localization<p> + * + * Currently HSSF always sets this to 1 and it seems to work fine even in Germany. * - * REFERENCE: PG 298 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P> - * @author Andrew C. Oliver (acoliver at apache dot org) * @version 2.0-pre */ -public final class CountryRecord - extends StandardRecord -{ - public final static short sid = 0x8c; +public final class CountryRecord extends StandardRecord { + public static final short sid = 0x8c; // 1 for US - private short field_1_default_country; - private short field_2_current_country; + private short field_1_default_country; + private short field_2_current_country; - public CountryRecord() - { + public CountryRecord() {} + + public CountryRecord(CountryRecord other) { + super(other); + field_1_default_country = other.field_1_default_country; + field_2_current_country = other.field_2_current_country; } - public CountryRecord(RecordInputStream in) - { + public CountryRecord(RecordInputStream in) { field_1_default_country = in.readShort(); field_2_current_country = in.readShort(); } @@ -120,4 +119,9 @@ public final class CountryRecord { return sid; } + + @Override + public CountryRecord copy() { + return new CountryRecord(this); + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/DBCellRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/DBCellRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/DBCellRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/DBCellRecord.java Sun Dec 22 21:44:45 2019 @@ -19,39 +19,15 @@ 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: DBCell Record (0x00D7)<p> - * Description: Used by Excel and other MS apps to quickly find rows in the sheets.<P> - * REFERENCE: PG 299/440 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) + * Used by Excel and other MS apps to quickly find rows in the sheets. */ -public final class DBCellRecord extends StandardRecord implements Cloneable { - public final static short sid = 0x00D7; - public final static int BLOCK_SIZE = 32; - - public static final class Builder { - private short[] _cellOffsets; - private int _nCellOffsets; - public Builder() { - _cellOffsets = new short[4]; - } - - public void addCellOffset(int cellRefOffset) { - if (_cellOffsets.length <= _nCellOffsets) { - short[] temp = new short[_nCellOffsets * 2]; - System.arraycopy(_cellOffsets, 0, temp, 0, _nCellOffsets); - _cellOffsets = temp; - } - _cellOffsets[_nCellOffsets] = (short) cellRefOffset; - _nCellOffsets++; - } +public final class DBCellRecord extends StandardRecord { + public static final short sid = 0x00D7; + public static final int BLOCK_SIZE = 32; - public DBCellRecord build(int rowOffset) { - short[] cellOffsets = new short[_nCellOffsets]; - System.arraycopy(_cellOffsets, 0, cellOffsets, 0, _nCellOffsets); - return new DBCellRecord(rowOffset, cellOffsets); - } - } /** * offset from the start of this DBCellRecord to the start of the first cell in * the next DBCell block. @@ -59,23 +35,21 @@ public final class DBCellRecord extends private final int field_1_row_offset; private final short[] field_2_cell_offsets; - DBCellRecord(int rowOffset, short[]cellOffsets) { + public DBCellRecord(int rowOffset, short[] cellOffsets) { field_1_row_offset = rowOffset; field_2_cell_offsets = cellOffsets; } public DBCellRecord(RecordInputStream in) { field_1_row_offset = in.readUShort(); - int size = in.remaining(); + int size = in.remaining(); field_2_cell_offsets = new short[ size / 2 ]; - for (int i=0;i<field_2_cell_offsets.length;i++) - { + for (int i=0;i<field_2_cell_offsets.length;i++) { field_2_cell_offsets[ i ] = in.readShort(); } } - public String toString() { StringBuilder buffer = new StringBuilder(); @@ -91,8 +65,8 @@ public final class DBCellRecord extends public void serialize(LittleEndianOutput out) { out.writeInt(field_1_row_offset); - for (int k = 0; k < field_2_cell_offsets.length; k++) { - out.writeShort(field_2_cell_offsets[ k ]); + for (short field_2_cell_offset : field_2_cell_offsets) { + out.writeShort(field_2_cell_offset); } } protected int getDataSize() { @@ -104,7 +78,15 @@ public final class DBCellRecord extends } @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") public DBCellRecord clone() { + return copy(); + } + + @Override + public DBCellRecord copy() { // safe because immutable return this; } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/DConRefRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/DConRefRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/DConRefRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/DConRefRecord.java Sun Dec 22 21:44:45 2019 @@ -18,10 +18,10 @@ */ package org.apache.poi.hssf.record; +import java.io.ByteArrayInputStream; import java.util.Arrays; import org.apache.poi.util.IOUtils; -import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.RecordFormatException; import org.apache.poi.util.StringUtil; @@ -67,8 +67,7 @@ import org.apache.poi.util.StringUtil; * * At the moment this class is read-only. */ -public class DConRefRecord extends StandardRecord -{ +public class DConRefRecord extends StandardRecord { //arbitrarily selected; may need to increase private static final int MAX_RECORD_LENGTH = 100_000; @@ -108,54 +107,25 @@ public class DConRefRecord extends Stand */ private byte[] _unused; + public DConRefRecord(DConRefRecord other) { + super(other); + firstCol = other.firstCol; + firstRow = other.firstRow; + lastCol = other.lastCol; + lastRow = other.lastRow; + charCount = other.charCount; + charType = other.charType; + path = (other.path == null) ? null : other.path.clone(); + _unused = (other._unused == null) ? null : other._unused.clone(); + } + /** * Read constructor. * * @param data byte array containing a DConRef Record, including the header. */ - public DConRefRecord(byte[] data) - { - int offset = 0; - if (!(LittleEndian.getShort(data, offset) == DConRefRecord.sid)) - throw new RecordFormatException("incompatible sid."); - offset += LittleEndian.SHORT_SIZE; - - //length = LittleEndian.getShort(data, offset); - offset += LittleEndian.SHORT_SIZE; - - firstRow = LittleEndian.getUShort(data, offset); - offset += LittleEndian.SHORT_SIZE; - lastRow = LittleEndian.getUShort(data, offset); - offset += LittleEndian.SHORT_SIZE; - firstCol = LittleEndian.getUByte(data, offset); - offset += LittleEndian.BYTE_SIZE; - lastCol = LittleEndian.getUByte(data, offset); - offset += LittleEndian.BYTE_SIZE; - charCount = LittleEndian.getUShort(data, offset); - offset += LittleEndian.SHORT_SIZE; - if (charCount < 2) - throw new RecordFormatException("Character count must be >= 2"); - - charType = LittleEndian.getUByte(data, offset); - offset += LittleEndian.BYTE_SIZE; //7 bits reserved + 1 bit type - - /* - * bytelength is the length of the string in bytes, which depends on whether the string is - * made of single- or double-byte chars. This is given by charType, which equals 0 if - * single-byte, 1 if double-byte. - */ - int byteLength = charCount * ((charType & 1) + 1); - - path = LittleEndian.getByteArray(data, offset, byteLength, MAX_RECORD_LENGTH); - offset += byteLength; - - /* - * If it's a self reference, the last one or two bytes (depending on char type) are the - * unused field. Not sure If i need to bother with this... - */ - if (path[0] == 0x02) - _unused = LittleEndian.getByteArray(data, offset, (charType + 1), MAX_RECORD_LENGTH); - + public DConRefRecord(byte[] data) { + this(bytesToRIStream(data)); } /** @@ -163,10 +133,10 @@ public class DConRefRecord extends Stand * * @param inStream RecordInputStream containing a DConRefRecord structure. */ - public DConRefRecord(RecordInputStream inStream) - { - if (inStream.getSid() != sid) + public DConRefRecord(RecordInputStream inStream) { + if (inStream.getSid() != sid) { throw new RecordFormatException("Wrong sid: " + inStream.getSid()); + } firstRow = inStream.readUShort(); lastRow = inStream.readUShort(); @@ -174,17 +144,23 @@ public class DConRefRecord extends Stand lastCol = inStream.readUByte(); charCount = inStream.readUShort(); - charType = inStream.readUByte() & 0x01; //first bit only. - // byteLength depends on whether we are using single- or double-byte chars. - int byteLength = charCount * (charType + 1); + // 7 bits reserved + 1 bit type - first bit only + charType = inStream.readUByte() & 0x01; + + // bytelength is the length of the string in bytes, which depends on whether the string is + // made of single- or double-byte chars. This is given by charType, which equals 0 if + // single-byte, 1 if double-byte. + final int byteLength = charCount * (charType + 1); path = IOUtils.safelyAllocate(byteLength, MAX_RECORD_LENGTH); inStream.readFully(path); - if (path[0] == 0x02) + // If it's a self reference, the last one or two bytes (depending on char type) are the + // unused field. Not sure If i need to bother with this... + if (path[0] == 0x02) { _unused = inStream.readRemainder(); - + } } /* @@ -291,8 +267,7 @@ public class DConRefRecord extends Stand //all of the path strings start with either 0x02 or 0x01 followed by zero or //more of 0x01..0x08 int offset = 1; - while (path[offset] < 0x20 && offset < path.length) - { + while (offset < path.length && path[offset] < 0x20) { offset++; } String out = new String(Arrays.copyOfRange(path, offset, path.length), StringUtil.UTF8); @@ -310,8 +285,17 @@ public class DConRefRecord extends Stand */ public boolean isExternalRef() { - if (path[0] == 0x01) - return true; - return false; + return path[0] == 0x01; + } + + @Override + public DConRefRecord copy() { + return new DConRefRecord(this); + } + + private static RecordInputStream bytesToRIStream(byte[] data) { + RecordInputStream ric = new RecordInputStream(new ByteArrayInputStream(data)); + ric.nextRecord(); + return ric; } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/DSFRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/DSFRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/DSFRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/DSFRecord.java Sun Dec 22 21:44:45 2019 @@ -23,21 +23,26 @@ import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndianOutput; /** - * Title: Double Stream Flag Record (0x0161)<p> - * Description: tells if this is a double stream file. (always no for HSSF generated files)<p> - * Double Stream files contain both BIFF8 and BIFF7 workbooks.<p> - * REFERENCE: PG 305 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2) + * Tells if this is a double stream file. (never applies to HSSF generated files)<p> + * + * Double Stream files contain both BIFF8 and BIFF7 workbooks. */ public final class DSFRecord extends StandardRecord { - public final static short sid = 0x0161; + public static final short sid = 0x0161; private static final BitField biff5BookStreamFlag = BitFieldFactory.getInstance(0x0001); private int _options; + private DSFRecord(DSFRecord other) { + super(other); + _options = other._options; + } + private DSFRecord(int options) { _options = options; } + public DSFRecord(boolean isBiff5BookStreamPresent) { this(0); _options = biff5BookStreamFlag.setBoolean(0, isBiff5BookStreamPresent); @@ -71,4 +76,9 @@ public final class DSFRecord extends Sta public short getSid() { return sid; } + + @Override + public DSFRecord copy() { + return new DSFRecord(this); + } } Modified: poi/trunk/src/java/org/apache/poi/hssf/record/DVALRecord.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/DVALRecord.java?rev=1871911&r1=1871910&r2=1871911&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/record/DVALRecord.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/record/DVALRecord.java Sun Dec 22 21:44:45 2019 @@ -18,14 +18,13 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndianOutput; +import org.apache.poi.util.Removal; /** - * Title: DATAVALIDATIONS Record (0x01B2)<p> - * Description: used in data validation ; - * This record is the list header of all data validation records (0x01BE) in the current sheet. + * This record is the list header of all data validation records (0x01BE) in the current sheet. */ -public final class DVALRecord extends StandardRecord implements Cloneable { - public final static short sid = 0x01B2; +public final class DVALRecord extends StandardRecord { + public static final short sid = 0x01B2; /** Options of the DVAL */ private short field_1_options; @@ -47,12 +46,21 @@ public final class DVALRecord extends St field_5_dv_no = 0x00000000; } + public DVALRecord(DVALRecord other) { + super(other); + field_1_options = other.field_1_options; + field_2_horiz_pos = other.field_2_horiz_pos; + field_3_vert_pos = other.field_3_vert_pos; + field_cbo_id = other.field_cbo_id; + field_5_dv_no = other.field_5_dv_no; + } + public DVALRecord(RecordInputStream in) { field_1_options = in.readShort(); field_2_horiz_pos = in.readInt(); field_3_vert_pos = in.readInt(); - field_cbo_id = in.readInt(); - field_5_dv_no = in.readInt(); + field_cbo_id = in.readInt(); + field_5_dv_no = in.readInt(); } /** @@ -142,7 +150,6 @@ public final class DVALRecord extends St } public void serialize(LittleEndianOutput out) { - out.writeShort(getOptions()); out.writeInt(getHorizontalPos()); out.writeInt(getVerticalPos()); @@ -158,14 +165,16 @@ public final class DVALRecord extends St return sid; } - @Override - public DVALRecord clone() { - DVALRecord rec = new DVALRecord(); - rec.field_1_options = field_1_options; - rec.field_2_horiz_pos = field_2_horiz_pos; - rec.field_3_vert_pos = field_3_vert_pos; - rec.field_cbo_id = field_cbo_id; - rec.field_5_dv_no = field_5_dv_no; - return rec; + @Override + @SuppressWarnings("squid:S2975") + @Deprecated + @Removal(version = "5.0.0") + public DVALRecord clone() { + return copy(); + } + + @Override + public DVALRecord copy() { + return new DVALRecord(this); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org For additional commands, e-mail: commits-h...@poi.apache.org