You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2019/12/22 21:44:48 UTC

svn commit: r1871911 [13/15] - in /poi/trunk/src: integrationtest/org/apache/poi/ integrationtest/org/apache/poi/hssf/usermodel/ java/org/apache/poi/common/ java/org/apache/poi/ddf/ java/org/apache/poi/hssf/eventusermodel/dummyrecord/ java/org/apache/p...

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NumberPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NumberPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NumberPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NumberPtg.java Sun Dec 22 21:44:45 2019
@@ -24,9 +24,6 @@ import org.apache.poi.util.LittleEndianO
 /**
  * Number Stores a floating point value in a formula value stored in a 8 byte
  * field using IEEE notation
- * 
- * @author Avik Sengupta
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class NumberPtg extends ScalarConstantPtg {
 	public final static int SIZE = 9;
@@ -41,7 +38,7 @@ public final class NumberPtg extends Sca
 	 * Create a NumberPtg from a string representation of the number Number
 	 * format is not checked, it is expected to be validated in the parser that
 	 * calls this method.
-	 * 
+	 *
 	 * @param value String representation of a floating point number
 	 */
 	public NumberPtg(String value) {
@@ -68,4 +65,9 @@ public final class NumberPtg extends Sca
 	public String toFormulaString() {
 		return NumberToTextConverter.toText(field_1_value);
 	}
+
+	@Override
+	public NumberPtg copy() {
+		return this;
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/OperandPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/OperandPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/OperandPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/OperandPtg.java Sun Dec 22 21:44:45 2019
@@ -17,10 +17,13 @@
 
 package org.apache.poi.ss.formula.ptg;
 
-/**
- * @author Josh Micich
- */
-public abstract class OperandPtg extends Ptg implements Cloneable {
+public abstract class OperandPtg extends Ptg {
+
+	protected OperandPtg() {}
+
+	protected OperandPtg(OperandPtg other) {
+		super(other);
+	}
 
 	/**
 	 * All Operand {@link Ptg}s are classified ('relative', 'value', 'array')
@@ -28,11 +31,7 @@ public abstract class OperandPtg extends
 	public final boolean isBaseToken() {
 		return false;
 	}
-	public final OperandPtg copy() {
-		try {
-			return (OperandPtg) clone();
-		} catch (CloneNotSupportedException e) {
-			throw new RuntimeException(e);
-		}
-	}
+
+	@Override
+	public abstract OperandPtg copy();
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/OperationPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/OperationPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/OperationPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/OperationPtg.java Sun Dec 22 21:44:45 2019
@@ -26,19 +26,21 @@ public abstract class OperationPtg exten
     public final static int TYPE_BINARY   = 1;
     public final static int TYPE_FUNCTION = 2;
 
+    protected OperationPtg() {}
+
     /**
      *  returns a string representation of the operations
-     *  the length of the input array should equal the number returned by 
+     *  the length of the input array should equal the number returned by
      *  @see #getNumberOfOperands
-     *  
+     *
      */
     public abstract String toFormulaString(String[] operands);
-    
+
     /**
      * The number of operands expected by the operations
      */
     public abstract int getNumberOfOperands();
-    
+
     public byte getDefaultOperandClass() {
         return Ptg.CLASS_VALUE;
     }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ParenthesisPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ParenthesisPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ParenthesisPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ParenthesisPtg.java Sun Dec 22 21:44:45 2019
@@ -23,18 +23,13 @@ import org.apache.poi.util.LittleEndianO
  * While formula tokens are stored in RPN order and thus do not need parenthesis
  * for precedence reasons, Parenthesis tokens ARE written to ensure that user
  * entered parenthesis are displayed as-is on reading back
- * 
- * Avik Sengupta <lists@aviksengupta.com> Andrew C. Oliver (acoliver at
- * apache dot org)
- * 
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class ParenthesisPtg extends ControlPtg {
 
 	private final static int SIZE = 1;
 	public final static byte sid = 0x15;
 
-	public static final ControlPtg instance = new ParenthesisPtg();
+	public static final ParenthesisPtg instance = new ParenthesisPtg();
 
 	private ParenthesisPtg() {
 		// enforce singleton
@@ -55,4 +50,9 @@ public final class ParenthesisPtg extend
 	public String toFormulaString(String[] operands) {
 		return "(" + operands[0] + ")";
 	}
+
+	@Override
+	public ParenthesisPtg copy() {
+		return instance;
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/PercentPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/PercentPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/PercentPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/PercentPtg.java Sun Dec 22 21:44:45 2019
@@ -19,21 +19,19 @@ package org.apache.poi.ss.formula.ptg;
 
 /**
  * Percent PTG.
- *
- * @author Daniel Noll (daniel at nuix.com.au)
  */
 public final class PercentPtg extends ValueOperatorPtg {
     public final static int  SIZE = 1;
     public final static byte sid  = 0x14;
-    
+
     private final static String PERCENT = "%";
 
-    public static final ValueOperatorPtg instance = new PercentPtg();
+    public static final PercentPtg instance = new PercentPtg();
 
     private PercentPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -41,7 +39,7 @@ public final class PercentPtg extends Va
     public int getNumberOfOperands() {
         return 1;
     }
-       
+
     public String toFormulaString(String[] operands) {
         StringBuilder buffer = new StringBuilder();
 
@@ -49,4 +47,9 @@ public final class PercentPtg extends Va
         buffer.append(PERCENT);
         return buffer.toString();
     }
+
+    @Override
+    public PercentPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/PowerPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/PowerPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/PowerPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/PowerPtg.java Sun Dec 22 21:44:45 2019
@@ -17,20 +17,15 @@
 
 package org.apache.poi.ss.formula.ptg;
 
-/**
- *
- * @author  andy
- * @author Jason Height (jheight at chariot dot net dot au)
- */
 public final class PowerPtg extends ValueOperatorPtg {
     public final static byte sid  = 0x07;
 
-    public static final ValueOperatorPtg instance = new PowerPtg();
+    public static final PowerPtg instance = new PowerPtg();
 
     private PowerPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -38,14 +33,19 @@ public final class PowerPtg extends Valu
     public int getNumberOfOperands() {
         return 2; // TODO - 2 seems wrong (Jun 2008).  Maybe this method is not relevant
     }
- 
+
     public String toFormulaString(String[] operands) {
          StringBuilder buffer = new StringBuilder();
 
-        
+
         buffer.append(operands[ 0 ]);
         buffer.append("^");
         buffer.append(operands[ 1 ]);
         return buffer.toString();
-    }       
+    }
+
+    @Override
+    public PowerPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ptg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ptg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ptg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ptg.java Sun Dec 22 21:44:45 2019
@@ -20,6 +20,7 @@ package org.apache.poi.ss.formula.ptg;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.poi.common.Duplicatable;
 import org.apache.poi.util.LittleEndianByteArrayOutputStream;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
@@ -36,9 +37,21 @@ import org.apache.poi.util.LittleEndianO
  * <em>Reverse-Polish Notation</em> order. The RPN ordering also simplifies formula
  * evaluation logic, so POI mostly accesses <tt>Ptg</tt>s in the same way.
  */
-public abstract class Ptg {
+public abstract class Ptg implements Duplicatable {
 	public static final Ptg[] EMPTY_PTG_ARRAY = { };
 
+	public static final byte CLASS_REF = 0x00;
+	public static final byte CLASS_VALUE = 0x20;
+	public static final byte CLASS_ARRAY = 0x40;
+
+	private byte ptgClass = CLASS_REF; //base ptg
+
+	protected Ptg() {}
+
+	protected Ptg(Ptg other) {
+		ptgClass = other.ptgClass;
+	}
+
 	/**
 	 * Reads <tt>size</tt> bytes of the input stream, to create an array of <tt>Ptg</tt>s.
 	 * Extra data (beyond <tt>size</tt>) may be read if and <tt>ArrayPtg</tt>s are present.
@@ -199,7 +212,7 @@ public abstract class Ptg {
 	 */
 	public static int serializePtgs(Ptg[] ptgs, byte[] array, int offset) {
 		LittleEndianByteArrayOutputStream out = new LittleEndianByteArrayOutputStream(array, offset); // NOSONAR
-		
+
 		List<Ptg> arrayPtgs = null;
 
 		for (Ptg ptg : ptgs) {
@@ -241,12 +254,6 @@ public abstract class Ptg {
 		return this.getClass().toString();
 	}
 
-	public static final byte CLASS_REF = 0x00;
-	public static final byte CLASS_VALUE = 0x20;
-	public static final byte CLASS_ARRAY = 0x40;
-
-	private byte ptgClass = CLASS_REF; //base ptg
-
 	public final void setClass(byte thePtgClass) {
 		if (isBaseToken()) {
 			throw new RuntimeException("setClass should not be called on a base token");
@@ -311,4 +318,7 @@ public abstract class Ptg {
 		}
 		return false;
 	}
+
+	@Override
+	public abstract Ptg copy();
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RangePtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RangePtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RangePtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RangePtg.java Sun Dec 22 21:44:45 2019
@@ -20,14 +20,11 @@ package org.apache.poi.ss.formula.ptg;
 import org.apache.poi.util.LittleEndianOutput;
 
 
-/**
- * @author Daniel Noll (daniel at nuix dot com dot au)
- */
 public final class RangePtg  extends OperationPtg {
     public final static int  SIZE = 1;
     public final static byte sid  = 0x11;
 
-    public static final OperationPtg instance = new RangePtg();
+    public static final RangePtg instance = new RangePtg();
 
     private RangePtg() {
     	// enforce singleton
@@ -68,4 +65,8 @@ public final class RangePtg  extends Ope
         return 2;
     }
 
+    @Override
+    public RangePtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref2DPtgBase.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref2DPtgBase.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref2DPtgBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref2DPtgBase.java Sun Dec 22 21:44:45 2019
@@ -21,13 +21,9 @@ import org.apache.poi.ss.util.CellRefere
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
-/**
- * @author Josh Micich
- */
 abstract class Ref2DPtgBase extends RefPtgBase {
 	private final static int SIZE = 5;
 
-
 	protected Ref2DPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
 		setRow(row);
 		setColumn(column);
@@ -35,6 +31,11 @@ abstract class Ref2DPtgBase extends RefP
 		setColRelative(isColumnRelative);
 	}
 
+	protected Ref2DPtgBase(Ref2DPtgBase other)  {
+		super(other);
+	}
+
+
 	protected Ref2DPtgBase(LittleEndianInput in)  {
 		readCoordinates(in);
 	}

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPtg.java Sun Dec 22 21:44:45 2019
@@ -25,20 +25,23 @@ import org.apache.poi.util.LittleEndianI
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * <p>Title:        Reference 3D Ptg</p>
- * <p>Description:  Defined a cell in extern sheet.</p>
- * <p>REFERENCE: </p>
- * 
- * <p>This is HSSF only, as it matches the HSSF file format way of
- *  referring to the sheet by an extern index. The XSSF equivalent
- *  is {@link Ref3DPxg} 
+ * Reference 3D Ptg<p>
+ * Defined a cell in extern sheet.<p>
+ *
+ * This is HSSF only, as it matches the HSSF file format way of
+ * referring to the sheet by an extern index. The XSSF equivalent
+ * is {@link Ref3DPxg}
  */
 public final class Ref3DPtg extends RefPtgBase implements WorkbookDependentFormula, ExternSheetReferenceToken {
     public final static byte sid  = 0x3a;
 
     private final static int  SIZE = 7; // 6 + 1 for Ptg
-    private int             field_1_index_extern_sheet;
+    private int field_1_index_extern_sheet;
 
+    public Ref3DPtg(Ref3DPtg other) {
+        super(other);
+        field_1_index_extern_sheet = other.field_1_index_extern_sheet;
+    }
 
     public Ref3DPtg(LittleEndianInput in)  {
         field_1_index_extern_sheet = in.readShort();
@@ -95,4 +98,9 @@ public final class Ref3DPtg extends RefP
     public String toFormulaString() {
         throw new RuntimeException("3D references need a workbook to determine formula text");
     }
+
+    @Override
+    public Ref3DPtg copy() {
+        return new Ref3DPtg(this);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java Sun Dec 22 21:44:45 2019
@@ -24,25 +24,31 @@ import org.apache.poi.ss.util.CellRefere
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * <p>Title:        XSSF 3D Reference</p>
- * <p>Description:  Defines a cell in an external or different sheet.</p>
- * <p>REFERENCE: </p>
- * 
- * <p>This is XSSF only, as it stores the sheet / book references
- *  in String form. The HSSF equivalent using indexes is {@link Ref3DPtg}</p>
+ * XSSF 3D Reference<p>
+ * Defines a cell in an external or different sheet.<p>
+ *
+ * This is XSSF only, as it stores the sheet / book references
+ * in String form. The HSSF equivalent using indexes is {@link Ref3DPtg}
  */
 public final class Ref3DPxg extends RefPtgBase implements Pxg3D {
     private int externalWorkbookNumber = -1;
     private String firstSheetName;
     private String lastSheetName;
 
+    public Ref3DPxg(Ref3DPxg other) {
+        super(other);
+        externalWorkbookNumber = other.externalWorkbookNumber;
+        firstSheetName = other.firstSheetName;
+        lastSheetName = other.lastSheetName;
+    }
+
     public Ref3DPxg(int externalWorkbookNumber, SheetIdentifier sheetName, String cellref) {
         this(externalWorkbookNumber, sheetName, new CellReference(cellref));
     }
     public Ref3DPxg(int externalWorkbookNumber, SheetIdentifier sheetName, CellReference c) {
         super(c);
         this.externalWorkbookNumber = externalWorkbookNumber;
-        
+
         this.firstSheetName = sheetName.getSheetIdentifier().getName();
         if (sheetName instanceof SheetRangeIdentifier) {
             this.lastSheetName = ((SheetRangeIdentifier)sheetName).getLastSheetIdentifier().getName();
@@ -50,7 +56,7 @@ public final class Ref3DPxg extends RefP
             this.lastSheetName = null;
         }
     }
-    
+
     public Ref3DPxg(SheetIdentifier sheetName, String cellref) {
         this(sheetName, new CellReference(cellref));
     }
@@ -77,7 +83,7 @@ public final class Ref3DPxg extends RefP
         sb.append("]");
         return sb.toString();
     }
-    
+
     public int getExternalWorkbookNumber() {
         return externalWorkbookNumber;
     }
@@ -87,14 +93,14 @@ public final class Ref3DPxg extends RefP
     public String getLastSheetName() {
         return lastSheetName;
     }
-    
+
     public void setSheetName(String sheetName) {
         this.firstSheetName = sheetName;
     }
     public void setLastSheetName(String sheetName) {
         this.lastSheetName = sheetName;
     }
-    
+
     public String format2DRefAsString() {
         return formatReferenceAsString();
     }
@@ -107,11 +113,16 @@ public final class Ref3DPxg extends RefP
         sb.append(formatReferenceAsString());
         return sb.toString();
     }
-    
+
     public int getSize() {
         return 1;
     }
     public void write(LittleEndianOutput out) {
         throw new IllegalStateException("XSSF-only Ptg, should not be serialised");
     }
+
+    @Override
+    public Ref3DPxg copy() {
+        return new Ref3DPxg(this);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefErrorPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefErrorPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefErrorPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefErrorPtg.java Sun Dec 22 21:44:45 2019
@@ -23,7 +23,6 @@ import org.apache.poi.util.LittleEndianO
 
 /**
  * RefError - handles deleted cell reference
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class RefErrorPtg extends OperandPtg {
 
@@ -34,6 +33,12 @@ public final class RefErrorPtg extends O
     public RefErrorPtg() {
         field_1_reserved = 0;
     }
+
+    public RefErrorPtg(RefErrorPtg other) {
+        super(other);
+        field_1_reserved = other.field_1_reserved;
+    }
+
     public RefErrorPtg(LittleEndianInput in)  {
         field_1_reserved = in.readInt();
     }
@@ -55,8 +60,13 @@ public final class RefErrorPtg extends O
     public String toFormulaString() {
         return FormulaError.REF.getString();
     }
-    
+
     public byte getDefaultOperandClass() {
         return Ptg.CLASS_REF;
     }
+
+    @Override
+    public RefErrorPtg copy() {
+        return new RefErrorPtg(this);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefNPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefNPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefNPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefNPtg.java Sun Dec 22 21:44:45 2019
@@ -20,10 +20,6 @@ package org.apache.poi.ss.formula.ptg;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.util.LittleEndianInput;
 
-/**
- * RefNPtg
- * @author Jason Height (jheight at apache dot com)
- */
 public final class RefNPtg extends Ref2DPtgBase {
 	public final static byte sid = 0x2C;
 
@@ -31,6 +27,10 @@ public final class RefNPtg extends Ref2D
 		super(in);
 	}
 
+    public RefNPtg(RefNPtg other) {
+	    super(other);
+    }
+
 	protected byte getSid() {
 		return sid;
 	}
@@ -44,13 +44,18 @@ public final class RefNPtg extends Ref2D
         } else {
             builder.append(getRow()+1);
         }
-        
+
         if(isColRelative()) {
             builder.append(" ColOffset: ").append(getColumn());
         } else {
             builder.append(CellReference.convertNumToColString(getColumn()));
         }
-        
+
         return builder.toString();
     }
+
+    @Override
+    public RefNPtg copy() {
+        return new RefNPtg(this);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefPtg.java Sun Dec 22 21:44:45 2019
@@ -22,8 +22,6 @@ import org.apache.poi.util.LittleEndianI
 
 /**
  * ReferencePtg - handles references (such as A1, A2, IA4)
- * @author  Andrew C. Oliver (acoliver@apache.org)
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class RefPtg extends Ref2DPtgBase {
 	public final static byte sid = 0x24;
@@ -36,6 +34,10 @@ public final class RefPtg extends Ref2DP
 		super(new CellReference(cellref));
 	}
 
+	public RefPtg(RefPtg other) {
+		super(other);
+	}
+
 	public RefPtg(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
 		super(row, column, isRowRelative, isColumnRelative);
 	}
@@ -51,4 +53,9 @@ public final class RefPtg extends Ref2DP
 	protected byte getSid() {
 		return sid;
 	}
+
+	@Override
+	public RefPtg copy() {
+		return new RefPtg(this);
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefPtgBase.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefPtgBase.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefPtgBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/RefPtgBase.java Sun Dec 22 21:44:45 2019
@@ -25,12 +25,21 @@ import org.apache.poi.util.LittleEndianO
 
 /**
  * ReferencePtgBase - handles references (such as A1, A2, IA4)
- *
- * @author Andrew C. Oliver (acoliver@apache.org)
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public abstract class RefPtgBase extends OperandPtg {
 
+	/**
+	 * YK: subclasses of RefPtgBase are used by the FormulaParser and FormulaEvaluator accross HSSF and XSSF.
+	 * The bit mask should accommodate the maximum number of avaiable columns, i.e. 0x3FFF.
+	 *
+	 * @see org.apache.poi.ss.SpreadsheetVersion
+	 */
+	private static final BitField column = BitFieldFactory.getInstance(0x3FFF);
+
+	private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000);
+	private static final BitField colRelative = BitFieldFactory.getInstance(0x4000);
+
+
 	/** The row index - zero based unsigned 16 bit value */
 	private int field_1_row;
 	/**
@@ -38,19 +47,13 @@ public abstract class RefPtgBase extends
 	 * 16 - isRowRelative - bit 15 - isColumnRelative
 	 */
 	private int field_2_col;
-	private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000);
-	private static final BitField colRelative = BitFieldFactory.getInstance(0x4000);
 
-    /**
-     * YK: subclasses of RefPtgBase are used by the FormulaParser and FormulaEvaluator accross HSSF and XSSF.
-     * The bit mask should accommodate the maximum number of avaiable columns, i.e. 0x3FFF.
-     *
-     * @see org.apache.poi.ss.SpreadsheetVersion
-     */
-    private static final BitField column = BitFieldFactory.getInstance(0x3FFF);
+	protected RefPtgBase() {}
 
-	protected RefPtgBase() {
-		// Required for clone methods
+	protected RefPtgBase(RefPtgBase other) {
+		super(other);
+		field_1_row = other.field_1_row;
+		field_2_col = other.field_2_col;
 	}
 
 	protected RefPtgBase(CellReference c) {

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ScalarConstantPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ScalarConstantPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ScalarConstantPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ScalarConstantPtg.java Sun Dec 22 21:44:45 2019
@@ -19,9 +19,7 @@ package org.apache.poi.ss.formula.ptg;
 
 
 /**
- * Common superclass of all {@link Ptg}s that represent simple constant values.
- *
- * @author Josh Micich
+ * Common superclass of all {@link Ptg Ptgs} that represent simple constant values.
  */
 public abstract class ScalarConstantPtg extends Ptg {
 	public final boolean isBaseToken() {
@@ -39,4 +37,6 @@ public abstract class ScalarConstantPtg
 		sb.append("]");
 		return sb.toString();
 	}
+
+
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/StringPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/StringPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/StringPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/StringPtg.java Sun Dec 22 21:44:45 2019
@@ -24,10 +24,6 @@ import org.apache.poi.util.StringUtil;
 /**
  * String Stores a String value in a formula value stored in the format
  * &lt;length 2 bytes&gt;char[]
- * 
- * @author Werner Froidevaux
- * @author Jason Height (jheight at chariot dot net dot au)
- * @author Bernard Chesnoy
  */
 public final class StringPtg extends ScalarConstantPtg {
      public final static byte sid = 0x17;
@@ -56,7 +52,7 @@ public final class StringPtg extends Sca
      * Create a StringPtg from a string representation of the number Number
      * format is not checked, it is expected to be validated in the parser that
      * calls this method.
-     * 
+     *
      * @param value :
      *            String representation of a floating point number
      */
@@ -105,4 +101,9 @@ public final class StringPtg extends Sca
         sb.append(FORMULA_DELIMITER);
         return sb.toString();
     }
+
+    @Override
+    public StringPtg copy() {
+        return this;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/SubtractPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/SubtractPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/SubtractPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/SubtractPtg.java Sun Dec 22 21:44:45 2019
@@ -17,20 +17,15 @@
 
 package org.apache.poi.ss.formula.ptg;
 
-/**
- *
- * @author  andy
- * @author Jason Height (jheight at chariot dot net dot au)
- */
 public final class SubtractPtg extends ValueOperatorPtg {
     public final static byte sid  = 0x04;
 
-    public static final ValueOperatorPtg instance = new SubtractPtg();
+    public static final SubtractPtg instance = new SubtractPtg();
 
     private SubtractPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -38,7 +33,7 @@ public final class SubtractPtg extends V
     public int getNumberOfOperands() {
         return 2;
     }
-       
+
     public String toFormulaString(String[] operands) {
         StringBuilder buffer = new StringBuilder();
 
@@ -47,4 +42,9 @@ public final class SubtractPtg extends V
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }
+
+    @Override
+    public SubtractPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/TblPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/TblPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/TblPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/TblPtg.java Sun Dec 22 21:44:45 2019
@@ -37,6 +37,7 @@ import org.apache.poi.util.LittleEndianO
 public final class TblPtg extends ControlPtg {
     private final static int  SIZE = 5;
     public final static short sid  = 0x02;
+
     /** The row number of the upper left corner */
     private final int field_1_first_row;
     /** The column number of the upper left corner */
@@ -77,4 +78,10 @@ public final class TblPtg extends Contro
         buffer.append("top left col = ").append(getColumn()).append("\n");
         return buffer.toString();
     }
+
+    @Override
+    public TblPtg copy() {
+        // immutable
+        return this;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnaryMinusPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnaryMinusPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnaryMinusPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnaryMinusPtg.java Sun Dec 22 21:44:45 2019
@@ -18,21 +18,19 @@
 package org.apache.poi.ss.formula.ptg;
 
 /**
- * Unary Plus operator
- * does not have any effect on the operand
- * @author Avik Sengupta
+ * Unary Plus operator - does not have any effect on the operand
  */
 public final class UnaryMinusPtg extends ValueOperatorPtg {
     public final static byte sid  = 0x13;
-    
+
     private final static String MINUS = "-";
 
-    public static final ValueOperatorPtg instance = new UnaryMinusPtg();
+    public static final UnaryMinusPtg instance = new UnaryMinusPtg();
 
     private UnaryMinusPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -40,12 +38,17 @@ public final class UnaryMinusPtg extends
     public int getNumberOfOperands() {
         return 1;
     }
-    
-   /** implementation of method from OperationsPtg*/  
+
+   /** implementation of method from OperationsPtg*/
     public String toFormulaString(String[] operands) {
         StringBuilder buffer = new StringBuilder();
         buffer.append(MINUS);
         buffer.append(operands[ 0]);
         return buffer.toString();
     }
+
+    @Override
+    public UnaryMinusPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnaryPlusPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnaryPlusPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnaryPlusPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnaryPlusPtg.java Sun Dec 22 21:44:45 2019
@@ -18,21 +18,19 @@
 package org.apache.poi.ss.formula.ptg;
 
 /**
- * Unary Plus operator
- * does not have any effect on the operand
- * @author Avik Sengupta
+ * Unary Plus operator -  does not have any effect on the operand
  */
 public final class UnaryPlusPtg extends ValueOperatorPtg {
     public final static byte sid  = 0x12;
-    
+
     private final static String ADD = "+";
 
-    public static final ValueOperatorPtg instance = new UnaryPlusPtg();
+    public static final UnaryPlusPtg instance = new UnaryPlusPtg();
 
     private UnaryPlusPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -40,12 +38,17 @@ public final class UnaryPlusPtg extends
     public int getNumberOfOperands() {
         return 1;
     }
-    
-   /** implementation of method from OperationsPtg*/  
+
+   /** implementation of method from OperationsPtg*/
     public String toFormulaString(String[] operands) {
         StringBuilder buffer = new StringBuilder();
         buffer.append(ADD);
         buffer.append(operands[ 0]);
         return buffer.toString();
     }
+
+    @Override
+    public UnaryPlusPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnionPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnionPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnionPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnionPtg.java Sun Dec 22 21:44:45 2019
@@ -26,7 +26,7 @@ import org.apache.poi.util.LittleEndianO
 public final class UnionPtg extends OperationPtg {
     public final static byte sid  = 0x10;
 
-    public static final OperationPtg instance = new UnionPtg();
+    public static final UnionPtg instance = new UnionPtg();
 
     private UnionPtg() {
     	// enforce singleton
@@ -67,4 +67,8 @@ public final class UnionPtg extends Oper
         return 2;
     }
 
+    @Override
+    public UnionPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnknownPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnknownPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnknownPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/UnknownPtg.java Sun Dec 22 21:44:45 2019
@@ -18,10 +18,6 @@ package org.apache.poi.ss.formula.ptg;
 
 import org.apache.poi.util.LittleEndianOutput;
 
-/**
- * @author andy
- * @author Jason Height (jheight at chariot dot net dot au)
- */
 public class UnknownPtg extends Ptg {
     private short size = 1;
     private final int _sid;
@@ -47,4 +43,9 @@ public class UnknownPtg extends Ptg {
     public byte getDefaultOperandClass() {
         return Ptg.CLASS_VALUE;
     }
+
+    @Override
+    public UnknownPtg copy() {
+        return this;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ValueOperatorPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ValueOperatorPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ValueOperatorPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ValueOperatorPtg.java Sun Dec 22 21:44:45 2019
@@ -23,11 +23,11 @@ import org.apache.poi.util.LittleEndianO
  * Common superclass of all value operators. Subclasses include all unary and
  * binary operators except for the reference operators (IntersectionPtg,
  * RangePtg, UnionPtg)
- * 
- * @author Josh Micich
  */
 public abstract class ValueOperatorPtg extends OperationPtg {
 
+	protected ValueOperatorPtg() {}
+
 	/**
 	 * All Operator <tt>Ptg</tt>s are base tokens (i.e. are not RVA classified)
 	 */

Modified: poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddress.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddress.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddress.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddress.java Sun Dec 22 21:44:45 2019
@@ -24,8 +24,8 @@ import org.apache.poi.util.LittleEndianO
 
 /**
  * See OOO documentation: excelfileformat.pdf sec 2.5.14 - 'Cell Range Address'<p>
- * 
- * <p>In the Microsoft documentation, this is also known as a 
+ *
+ * <p>In the Microsoft documentation, this is also known as a
  *  Ref8U - see page 831 of version 1.0 of the documentation.
  *
  * Note - {@link SelectionRecord} uses the BIFF5 version of this structure
@@ -36,7 +36,7 @@ public class CellRangeAddress extends Ce
 
 	/**
 	 * Creates new cell range. Indexes are zero-based.
-	 * 
+	 *
 	 * @param firstRow Index of first row
 	 * @param lastRow Index of last row (inclusive), must be equal to or larger than {@code firstRow}
 	 * @param firstCol Index of first column
@@ -44,7 +44,7 @@ public class CellRangeAddress extends Ce
 	 */
 	public CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) {
 		super(firstRow, lastRow, firstCol, lastCol);
-		
+
 		if (lastRow < firstRow || lastCol < firstCol) {
 			throw new IllegalArgumentException("Invalid cell range, having lastRow < firstRow || lastCol < firstCol, " +
 					"had rows " + lastRow + " >= " + firstRow + " or cells " + lastCol + " >= " + firstCol);
@@ -70,6 +70,7 @@ public class CellRangeAddress extends Ce
 		return in.readUShort();
 	}
 
+	@Override
 	public CellRangeAddress copy() {
 		return new CellRangeAddress(getFirstRow(), getLastRow(), getFirstColumn(), getLastColumn());
 	}
@@ -103,7 +104,7 @@ public class CellRangeAddress extends Ce
 
         //for a single-cell reference return A1 instead of A1:A1
         //for full-column ranges or full-row ranges return A:A instead of A,
-        //and 1:1 instead of 1         
+        //and 1:1 instead of 1
         if(!cellRefFrom.equals(cellRefTo)
             || isFullColumnRange() || isFullRowRange()){
             sb.append(':');
@@ -114,10 +115,10 @@ public class CellRangeAddress extends Ce
 
     /**
      * Creates a CellRangeAddress from a cell range reference string.
-     *  
-     * @param ref usually a standard area ref (e.g. "B1:D8").  May be a single 
-     *            cell ref (e.g. "B5") in which case the result is a 1 x 1 cell 
-     *            range. May also be a whole row range (e.g. "3:5"), or a whole 
+     *
+     * @param ref usually a standard area ref (e.g. "B1:D8").  May be a single
+     *            cell ref (e.g. "B5") in which case the result is a 1 x 1 cell
+     *            range. May also be a whole row range (e.g. "3:5"), or a whole
      *            column range (e.g. "C:F")
      */
     public static CellRangeAddress valueOf(String ref) {

Modified: poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddressBase.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddressBase.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddressBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddressBase.java Sun Dec 22 21:44:45 2019
@@ -17,14 +17,12 @@
 
 package org.apache.poi.ss.util;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
 
+import org.apache.poi.common.Duplicatable;
 import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.usermodel.Cell;
 
@@ -34,13 +32,13 @@ import org.apache.poi.ss.usermodel.Cell;
  *
  * Common superclass of 8-bit and 16-bit versions
  */
-public abstract class CellRangeAddressBase implements Iterable<CellAddress> {
+public abstract class CellRangeAddressBase implements Iterable<CellAddress>, Duplicatable {
 
     /**
      * Indicates a cell or range is in the given relative position in a range.
      * More than one of these may apply at once.
      */
-    public static enum CellPosition {
+    public enum CellPosition {
         /** range starting rows are equal */
         TOP,
         /** range ending rows are equal */
@@ -138,7 +136,7 @@ public abstract class CellRangeAddressBa
 	}
 
 	/**
-	 * Determines if the given coordinates lie within the bounds 
+	 * Determines if the given coordinates lie within the bounds
 	 * of this range.
 	 *
 	 * @param rowInd The row, 0-based.
@@ -150,11 +148,11 @@ public abstract class CellRangeAddressBa
 		return _firstRow <= rowInd && rowInd <= _lastRow && //containsRow
 				_firstCol <= colInd && colInd <= _lastCol; //containsColumn
 	}
-	
+
     /**
-     * Determines if the given {@link CellReference} lies within the bounds 
-     * of this range.  
-     * <p>NOTE: It is up to the caller to ensure the reference is 
+     * Determines if the given {@link CellReference} lies within the bounds
+     * of this range.
+     * <p>NOTE: It is up to the caller to ensure the reference is
      * for the correct sheet, since this instance doesn't have a sheet reference.
      *
      * @param ref the CellReference to check
@@ -164,11 +162,11 @@ public abstract class CellRangeAddressBa
 	public boolean isInRange(CellReference ref) {
 	    return isInRange(ref.getRow(), ref.getCol());
 	}
-	
+
     /**
-     * Determines if the given {@link CellAddress} lies within the bounds 
-     * of this range.  
-     * <p>NOTE: It is up to the caller to ensure the reference is 
+     * Determines if the given {@link CellAddress} lies within the bounds
+     * of this range.
+     * <p>NOTE: It is up to the caller to ensure the reference is
      * for the correct sheet, since this instance doesn't have a sheet reference.
      *
      * @param ref the CellAddress to check
@@ -178,11 +176,11 @@ public abstract class CellRangeAddressBa
     public boolean isInRange(CellAddress ref) {
         return isInRange(ref.getRow(), ref.getColumn());
     }
-	
+
 	/**
-	 * Determines if the given {@link Cell} lies within the bounds 
-	 * of this range.  
-	 * <p>NOTE: It is up to the caller to ensure the reference is 
+	 * Determines if the given {@link Cell} lies within the bounds
+	 * of this range.
+	 * <p>NOTE: It is up to the caller to ensure the reference is
 	 * for the correct sheet, since this instance doesn't have a sheet reference.
 	 *
 	 * @param cell the Cell to check
@@ -192,7 +190,7 @@ public abstract class CellRangeAddressBa
 	public boolean isInRange(Cell cell) {
 	    return isInRange(cell.getRowIndex(), cell.getColumnIndex());
 	}
-	
+
 	/**
 	 * Check if the row is in the specified cell range
 	 *
@@ -202,7 +200,7 @@ public abstract class CellRangeAddressBa
 	public boolean containsRow(int rowInd) {
 		return _firstRow <= rowInd && rowInd <= _lastRow;
 	}
-	
+
 	/**
 	 * Check if the column is in the specified cell range
 	 *
@@ -212,7 +210,7 @@ public abstract class CellRangeAddressBa
 	public boolean containsColumn(int colInd) {
 		return _firstCol <= colInd && colInd <= _lastCol;
 	}
-	
+
 	/**
 	 * Determines whether or not this CellRangeAddress and the specified CellRangeAddress intersect.
 	 *
@@ -226,7 +224,7 @@ public abstract class CellRangeAddressBa
 				other._firstRow <= this._lastRow &&
 				other._firstCol <= this._lastCol;
 	}
-	
+
 	/**
 	 * Useful for logic like table/range styling, where some elements apply based on relative position in a range.
 	 * @param rowInd
@@ -245,10 +243,10 @@ public abstract class CellRangeAddressBa
 	    if (rowInd == getLastRow()) positions.add(CellPosition.BOTTOM);
 	    if (colInd == getFirstColumn()) positions.add(CellPosition.LEFT);
 	    if (colInd == getLastColumn()) positions.add(CellPosition.RIGHT);
-	    
+
 	    return positions;
 	}
-	
+
 	/**
 	 * @param firstCol column number for the upper left hand corner
 	 */
@@ -291,37 +289,37 @@ public abstract class CellRangeAddressBa
 	public Iterator<CellAddress> iterator() {
 		return new RowMajorCellAddressIterator(this);
 	}
-	
+
 	/**
 	 *  Iterates over the cell addresses in a cell range in row major order
-	 *  
+	 *
 	 *  The iterator is unaffected by changes to the CellRangeAddressBase instance
 	 *  after the iterator is created.
 	 */
 	private static class RowMajorCellAddressIterator implements Iterator<CellAddress> {
 		private final int firstRow, firstCol, lastRow, lastCol;
 		private int r, c;
-		
+
 		public RowMajorCellAddressIterator(CellRangeAddressBase ref) {
 			r = firstRow = ref.getFirstRow();
 			c = firstCol = ref.getFirstColumn();
 			lastRow = ref.getLastRow();
 			lastCol = ref.getLastColumn();
-			
+
 			// whole row and whole column ranges currently not supported
 			if (firstRow < 0) throw new IllegalStateException("First row cannot be negative.");
 			if (firstCol < 0) throw new IllegalStateException("First column cannot be negative.");
-			
+
 			// avoid infinite iteration
 			if (firstRow > lastRow) throw new IllegalStateException("First row cannot be greater than last row.");
 			if (firstCol > lastCol) throw new IllegalStateException("First column cannot be greater than last column.");
 		}
-		
+
 		@Override
 		public boolean hasNext() {
 			return r <= lastRow && c <= lastCol;
 		}
-		
+
 		@Override
 		public CellAddress next() {
 			if (hasNext()) {
@@ -346,7 +344,7 @@ public abstract class CellRangeAddressBa
 		CellAddress crB = new CellAddress(_lastRow, _lastCol);
 		return getClass().getName() + " [" + crA.formatAsString() + ":" + crB.formatAsString() +"]";
 	}
-	
+
 	// In case _firstRow > _lastRow or _firstCol > _lastCol
 	protected int getMinRow() {
 		return Math.min(_firstRow, _lastRow);
@@ -360,7 +358,7 @@ public abstract class CellRangeAddressBa
 	protected int getMaxColumn() {
 		return Math.max(_firstCol, _lastCol);
 	}
-	
+
 	@Override
 	public boolean equals(Object other) {
 		if (other instanceof CellRangeAddressBase) {
@@ -372,7 +370,7 @@ public abstract class CellRangeAddressBa
 		}
 		return false;
 	}
-	
+
 	@Override
 	public int hashCode() {
         return (getMinColumn() +

Modified: poi/trunk/src/java/org/apache/poi/ss/util/SSCellRange.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/util/SSCellRange.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/util/SSCellRange.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/util/SSCellRange.java Sun Dec 22 21:44:45 2019
@@ -20,7 +20,7 @@ package org.apache.poi.ss.util;
 import java.lang.reflect.Array;
 import java.util.Iterator;
 import java.util.List;
-import java.util.NoSuchElementException;
+import java.util.stream.Stream;
 
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellRange;
@@ -28,8 +28,6 @@ import org.apache.poi.util.Internal;
 
 /**
  * For POI internal use only
- *
- * @author Josh Micich
  */
 @Internal
 public final class SSCellRange<K extends Cell> implements CellRange<K> {
@@ -108,30 +106,8 @@ public final class SSCellRange<K extends
 		}
 		return result;
 	}
-	public Iterator<K> iterator() {
-		return new ArrayIterator<>(_flattenedArray);
-	}
-	private static final class ArrayIterator<D> implements Iterator<D> {
-
-		private final D[] _array;
-		private int _index;
 
-		public ArrayIterator(D[] array) {
-			_array = array.clone();
-			_index = 0;
-		}
-		public boolean hasNext() {
-			return _index < _array.length;
-		}
-		public D next() {
-			if (_index >= _array.length) {
-				throw new NoSuchElementException(String.valueOf(_index));
-			}
-			return _array[_index++];
-		}
-
-		public void remove() {
-			throw new UnsupportedOperationException("Cannot remove cells from this CellRange.");
-		}
+	public Iterator<K> iterator() {
+		return Stream.of(_flattenedArray).iterator();
 	}
 }

Modified: poi/trunk/src/java/org/apache/poi/util/IntMapper.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/util/IntMapper.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/util/IntMapper.java (original)
+++ poi/trunk/src/java/org/apache/poi/util/IntMapper.java Sun Dec 22 21:44:45 2019
@@ -19,76 +19,79 @@
 
 package org.apache.poi.util;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.poi.common.Duplicatable;
 
 /**
  * A List of objects that are indexed AND keyed by an int; also allows for getting
  * the index of a value in the list
- *
- * <p>I am happy is someone wants to re-implement this without using the
+ * <p>
+ * I am happy is someone wants to re-implement this without using the
  * internal list and hashmap. If so could you please make sure that
  * you can add elements half way into the list and have the value-key mappings
- * update</p>
- *
- *
- * @author Jason Height
+ * update
  */
 
-public class IntMapper<T>
-{
-  private List<T> elements;
-  private Map<T,Integer> valueKeyMap;
+public class IntMapper<T> implements Duplicatable {
+    private final List<T> elements;
+    private final Map<T, Integer> valueKeyMap;
 
-  private static final int _default_size = 10;
+    private static final int _default_size = 10;
 
     /**
      * create an IntMapper of default size
      */
-
-    public IntMapper()
-    {
+    public IntMapper() {
         this(_default_size);
     }
 
-    public IntMapper(final int initialCapacity)
-    {
+    public IntMapper(final int initialCapacity) {
         elements = new ArrayList<>(initialCapacity);
         valueKeyMap = new HashMap<>(initialCapacity);
     }
 
+    public IntMapper(IntMapper<T> other) {
+        elements = new ArrayList<>(other.elements);
+        valueKeyMap = new HashMap<>(other.valueKeyMap);
+    }
+
     /**
      * Appends the specified element to the end of this list
      *
      * @param value element to be appended to this list.
-     *
      * @return true (as per the general contract of the Collection.add
-     *         method).
+     * method).
      */
-    public boolean add(final T value)
-    {
-      int index = elements.size();
-      elements.add(value);
-      valueKeyMap.put(value, index);
-      return true;
+    public boolean add(final T value) {
+        int index = elements.size();
+        elements.add(value);
+        valueKeyMap.put(value, index);
+        return true;
     }
 
     public int size() {
-      return elements.size();
+        return elements.size();
     }
 
     public T get(int index) {
-      return elements.get(index);
+        return elements.get(index);
     }
 
     public int getIndex(T o) {
-      Integer i = valueKeyMap.get(o);
-      if (i == null)
-        return -1;
-      return i.intValue();
+        return valueKeyMap.getOrDefault(o, -1);
     }
 
     public Iterator<T> iterator() {
-      return elements.iterator();
+        return elements.iterator();
     }
-}   // end public class IntMapper
 
+    @Override
+    public IntMapper<T> copy() {
+        return new IntMapper<>(this);
+    }
+}
\ No newline at end of file

Modified: poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileDecryptor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileDecryptor.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileDecryptor.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileDecryptor.java Sun Dec 22 21:44:45 2019
@@ -25,6 +25,7 @@ import static org.apache.poi.poifs.crypt
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.ByteBuffer;
 import java.security.GeneralSecurityException;
 import java.security.KeyPair;
 import java.security.MessageDigest;
@@ -56,43 +57,34 @@ import org.apache.poi.util.LittleEndian;
 /**
  * Decryptor implementation for Agile Encryption
  */
-public class AgileDecryptor extends Decryptor implements Cloneable {
+public class AgileDecryptor extends Decryptor {
+    static final byte[] kVerifierInputBlock = longToBytes(0xfea7d2763b4b9e79L);
+    static final byte[] kHashedVerifierBlock = longToBytes(0xd7aa0f6d3061344eL);
+    static final byte[] kCryptoKeyBlock = longToBytes(0x146e0be7abacd0d6L);
+    static final byte[] kIntegrityKeyBlock = longToBytes(0x5fb2ad010cb9e1f6L);
+    static final byte[] kIntegrityValueBlock = longToBytes(0xa0677f02b22c8433L);
+
     private long _length = -1;
 
-    /* package */ static final byte[] kVerifierInputBlock;
-    /* package */ static final byte[] kHashedVerifierBlock;
-    /* package */ static final byte[] kCryptoKeyBlock;
-    /* package */ static final byte[] kIntegrityKeyBlock;
-    /* package */ static final byte[] kIntegrityValueBlock;
-
-    static {
-        kVerifierInputBlock =
-            new byte[] { (byte)0xfe, (byte)0xa7, (byte)0xd2, (byte)0x76,
-                         (byte)0x3b, (byte)0x4b, (byte)0x9e, (byte)0x79 };
-        kHashedVerifierBlock =
-            new byte[] { (byte)0xd7, (byte)0xaa, (byte)0x0f, (byte)0x6d,
-                         (byte)0x30, (byte)0x61, (byte)0x34, (byte)0x4e };
-        kCryptoKeyBlock =
-            new byte[] { (byte)0x14, (byte)0x6e, (byte)0x0b, (byte)0xe7,
-                         (byte)0xab, (byte)0xac, (byte)0xd0, (byte)0xd6 };
-        kIntegrityKeyBlock =
-            new byte[] { (byte)0x5f, (byte)0xb2, (byte)0xad, (byte)0x01, 
-                         (byte)0x0c, (byte)0xb9, (byte)0xe1, (byte)0xf6 };
-        kIntegrityValueBlock =
-            new byte[] { (byte)0xa0, (byte)0x67, (byte)0x7f, (byte)0x02,
-                         (byte)0xb2, (byte)0x2c, (byte)0x84, (byte)0x33 };
+    protected AgileDecryptor() {
     }
 
-    protected AgileDecryptor() {
+    protected AgileDecryptor(AgileDecryptor other) {
+        super(other);
+        _length = other._length;
+    }
+
+    private static byte[] longToBytes(long l) {
+        return ByteBuffer.allocate(Long.BYTES).putLong(l).array();
     }
-    
+
     /**
      * set decryption password
      */
     @Override
     public boolean verifyPassword(String password) throws GeneralSecurityException {
         AgileEncryptionVerifier ver = (AgileEncryptionVerifier)getEncryptionInfo().getVerifier();
-        AgileEncryptionHeader header = (AgileEncryptionHeader)getEncryptionInfo().getHeader(); 
+        AgileEncryptionHeader header = (AgileEncryptionHeader)getEncryptionInfo().getHeader();
 
         int blockSize = header.getBlockSize();
 
@@ -130,7 +122,7 @@ public class AgileDecryptor extends Decr
          */
         byte[] verifierHashDec = hashInput(ver, pwHash, kHashedVerifierBlock, ver.getEncryptedVerifierHash(), Cipher.DECRYPT_MODE);
         verifierHashDec = getBlock0(verifierHashDec, ver.getHashAlgorithm().hashSize);
-        
+
         /**
          * encryptedKeyValue: This attribute MUST be generated by using the following steps:
          * 1. Generate a random array of bytes that is the same size as specified by the
@@ -180,7 +172,7 @@ public class AgileDecryptor extends Decr
         cipher = getCipher(secretKey, cipherAlgo, ver.getChainingMode(), vec, Cipher.DECRYPT_MODE);
         byte[] hmacValue = cipher.doFinal(header.getEncryptedHmacValue());
         hmacValue = getBlock0(hmacValue, header.getHashAlgorithm().hashSize);
-        
+
         if (Arrays.equals(verifierHashDec, verifierHash)) {
             setSecretKey(secretKey);
             setIntegrityHmacKey(hmacKey);
@@ -194,7 +186,7 @@ public class AgileDecryptor extends Decr
     /**
      * instead of a password, it's also possible to decrypt via certificate.
      * Warning: this code is experimental and hasn't been validated
-     * 
+     *
      * @see <a href="http://social.msdn.microsoft.com/Forums/en-US/cc9092bb-0c82-4b5b-ae21-abf643bdb37c/agile-encryption-with-certificates">Agile encryption with certificates</a>
      *
      * @param keyPair
@@ -208,7 +200,7 @@ public class AgileDecryptor extends Decr
         HashAlgorithm hashAlgo = header.getHashAlgorithm();
         CipherAlgorithm cipherAlgo = header.getCipherAlgorithm();
         int blockSize = header.getBlockSize();
-        
+
         AgileCertificateEntry ace = null;
         for (AgileCertificateEntry aceEntry : ver.getCertificates()) {
             if (x509.equals(aceEntry.x509)) {
@@ -219,12 +211,12 @@ public class AgileDecryptor extends Decr
         if (ace == null) {
             return false;
         }
-        
+
         Cipher cipher = Cipher.getInstance("RSA");
         cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
         byte[] keyspec = cipher.doFinal(ace.encryptedKey);
         SecretKeySpec secretKey = new SecretKeySpec(keyspec, ver.getCipherAlgorithm().jceId);
-        
+
         Mac x509Hmac = CryptoFunctions.getMac(hashAlgo);
         x509Hmac.init(secretKey);
         byte[] certVerifier = x509Hmac.doFinal(ace.x509.getEncoded());
@@ -238,8 +230,8 @@ public class AgileDecryptor extends Decr
         cipher = getCipher(secretKey, cipherAlgo, header.getChainingMode(), vec, Cipher.DECRYPT_MODE);
         byte[] hmacValue = cipher.doFinal(header.getEncryptedHmacValue());
         hmacValue = getBlock0(hmacValue, hashAlgo.hashSize);
-        
-        
+
+
         if (Arrays.equals(ace.certVerifier, certVerifier)) {
             setSecretKey(secretKey);
             setIntegrityHmacKey(hmacKey);
@@ -268,7 +260,7 @@ public class AgileDecryptor extends Decr
         byte[] iv = generateIv(hashAlgo, ver.getSalt(), null, blockSize);
         Cipher cipher = getCipher(skey, cipherAlgo, chainMode, iv, cipherMode);
         byte[] hashFinal;
-        
+
         try {
             inputKey = getBlock0(inputKey, getNextBlockSize(inputKey.length, blockSize));
             hashFinal = cipher.doFinal(inputKey);
@@ -314,13 +306,13 @@ public class AgileDecryptor extends Decr
         }
 
         existing.init(encryptionMode, skey, aps);
-        
+
         return existing;
     }
 
     /**
      * 2.3.4.15 Data Encryption (Agile Encryption)
-     * 
+     *
      * The EncryptedPackage stream (1) MUST be encrypted in 4096-byte segments to facilitate nearly
      * random access while allowing CBC modes to be used in the encryption process.
      * The initialization vector for the encryption process MUST be obtained by using the zero-based
@@ -341,16 +333,16 @@ public class AgileDecryptor extends Decr
 
         // TODO: calculate integrity hmac while reading the stream
         // for a post-validation of the data
-        
+
         @Override
         protected Cipher initCipherForBlock(Cipher cipher, int block)
         throws GeneralSecurityException {
             return AgileDecryptor.initCipherForBlock(cipher, block, false, getEncryptionInfo(), getSecretKey(), Cipher.DECRYPT_MODE);
         }
     }
-    
+
     @Override
-    public AgileDecryptor clone() throws CloneNotSupportedException {
-        return (AgileDecryptor)super.clone();
+    public AgileDecryptor copy() {
+        return new AgileDecryptor(this);
     }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionHeader.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionHeader.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionHeader.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionHeader.java Sun Dec 22 21:44:45 2019
@@ -30,14 +30,20 @@ import org.apache.poi.poifs.crypt.Encryp
 import org.apache.poi.poifs.crypt.HashAlgorithm;
 import org.apache.poi.util.GenericRecordUtil;
 
-public class AgileEncryptionHeader extends EncryptionHeader implements Cloneable {
+public class AgileEncryptionHeader extends EncryptionHeader {
     private byte[] encryptedHmacKey;
     private byte[] encryptedHmacValue;
-    
+
     public AgileEncryptionHeader(String descriptor) {
         this(AgileEncryptionInfoBuilder.parseDescriptor(descriptor));
     }
-    
+
+    public AgileEncryptionHeader(AgileEncryptionHeader other) {
+        super(other);
+        encryptedHmacKey = (other.encryptedHmacKey == null) ? null : other.encryptedHmacKey.clone();
+        encryptedHmacValue = (other.encryptedHmacValue == null) ? null : other.encryptedHmacValue.clone();
+    }
+
     protected AgileEncryptionHeader(EncryptionDocument ed) {
         CTKeyData keyData;
         try {
@@ -50,7 +56,7 @@ public class AgileEncryptionHeader exten
         }
 
         int keyBits = (int)keyData.getKeyBits();
-        
+
         CipherAlgorithm ca = CipherAlgorithm.fromXmlId(keyData.getCipherAlgorithm().toString(), keyBits);
         setCipherAlgorithm(ca);
         setCipherProvider(ca.provider);
@@ -71,14 +77,14 @@ public class AgileEncryptionHeader exten
         default:
             throw new EncryptedDocumentException("Unsupported chaining mode - "+ keyData.getCipherChaining());
         }
-    
+
         int hashSize = keyData.getHashSize();
-        
+
         HashAlgorithm ha = HashAlgorithm.fromEcmaId(keyData.getHashAlgorithm().toString());
         setHashAlgorithm(ha);
 
         if (getHashAlgorithm().hashSize != hashSize) {
-            throw new EncryptedDocumentException("Unsupported hash algorithm: " + 
+            throw new EncryptedDocumentException("Unsupported hash algorithm: " +
                     keyData.getHashAlgorithm() + " @ " + hashSize + " bytes");
         }
 
@@ -87,13 +93,13 @@ public class AgileEncryptionHeader exten
         if (getKeySalt().length != saltLength) {
             throw new EncryptedDocumentException("Invalid salt length");
         }
-        
+
         CTDataIntegrity di = ed.getEncryption().getDataIntegrity();
         setEncryptedHmacKey(di.getEncryptedHmacKey());
         setEncryptedHmacValue(di.getEncryptedHmacValue());
     }
-    
-    
+
+
     public AgileEncryptionHeader(CipherAlgorithm algorithm, HashAlgorithm hashAlgorithm, int keyBits, int blockSize, ChainingMode chainingMode) {
         setCipherAlgorithm(algorithm);
         setHashAlgorithm(hashAlgorithm);
@@ -128,14 +134,6 @@ public class AgileEncryptionHeader exten
     }
 
     @Override
-    public AgileEncryptionHeader clone() throws CloneNotSupportedException {
-        AgileEncryptionHeader other = (AgileEncryptionHeader)super.clone();
-        other.encryptedHmacKey = (encryptedHmacKey == null) ? null : encryptedHmacKey.clone();
-        other.encryptedHmacValue = (encryptedHmacValue == null) ? null : encryptedHmacValue.clone();
-        return other;
-    }
-
-    @Override
     public Map<String, Supplier<?>> getGenericProperties() {
         return GenericRecordUtil.getGenericProperties(
             "base", super::getGenericProperties,
@@ -143,4 +141,9 @@ public class AgileEncryptionHeader exten
             "encryptedHmacValue", this::getEncryptedHmacValue
         );
     }
+
+    @Override
+    public AgileEncryptionHeader copy() {
+        return new AgileEncryptionHeader(this);
+    }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionVerifier.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionVerifier.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionVerifier.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionVerifier.java Sun Dec 22 21:44:45 2019
@@ -24,37 +24,44 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.poi.EncryptedDocumentException;
-import org.apache.poi.poifs.crypt.ChainingMode;
-import org.apache.poi.poifs.crypt.CipherAlgorithm;
-import org.apache.poi.poifs.crypt.EncryptionVerifier;
-import org.apache.poi.poifs.crypt.HashAlgorithm;
-
 import com.microsoft.schemas.office.x2006.encryption.CTKeyEncryptor;
 import com.microsoft.schemas.office.x2006.encryption.EncryptionDocument;
 import com.microsoft.schemas.office.x2006.encryption.STCipherChaining;
 import com.microsoft.schemas.office.x2006.keyEncryptor.certificate.CTCertificateKeyEncryptor;
 import com.microsoft.schemas.office.x2006.keyEncryptor.password.CTPasswordKeyEncryptor;
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.poifs.crypt.ChainingMode;
+import org.apache.poi.poifs.crypt.CipherAlgorithm;
+import org.apache.poi.poifs.crypt.EncryptionVerifier;
+import org.apache.poi.poifs.crypt.HashAlgorithm;
 
 /**
- * Used when checking if a key is valid for a document 
+ * Used when checking if a key is valid for a document
  */
-public class AgileEncryptionVerifier extends EncryptionVerifier implements Cloneable {
+public class AgileEncryptionVerifier extends EncryptionVerifier {
 
     public static class AgileCertificateEntry {
         X509Certificate x509;
         byte[] encryptedKey;
         byte[] certVerifier;
+
+        public AgileCertificateEntry() {}
+
+        public AgileCertificateEntry(AgileCertificateEntry other) {
+            x509 = other.x509;
+            encryptedKey = (other.encryptedKey == null) ? null : other.encryptedKey.clone();
+            certVerifier = (other.certVerifier == null) ? null : other.certVerifier.clone();
+        }
     }
-    
-    private List<AgileCertificateEntry> certList = new ArrayList<>();
+
+    private final List<AgileCertificateEntry> certList = new ArrayList<>();
     private int keyBits = -1;
     private int blockSize = -1;
 
     public AgileEncryptionVerifier(String descriptor) {
         this(AgileEncryptionInfoBuilder.parseDescriptor(descriptor));
     }
-    
+
     protected AgileEncryptionVerifier(EncryptionDocument ed) {
         Iterator<CTKeyEncryptor> encList = ed.getEncryption().getKeyEncryptors().getKeyEncryptorList().iterator();
         CTPasswordKeyEncryptor keyData;
@@ -66,37 +73,37 @@ public class AgileEncryptionVerifier ext
         } catch (Exception e) {
             throw new EncryptedDocumentException("Unable to parse keyData", e);
         }
-        
+
         int kb = (int)keyData.getKeyBits();
         CipherAlgorithm ca = CipherAlgorithm.fromXmlId(keyData.getCipherAlgorithm().toString(), kb);
         setCipherAlgorithm(ca);
 
         setKeySize(kb);
-        
+
         int blockSize = keyData.getBlockSize();
         setBlockSize(blockSize);
-        
+
         int hashSize = keyData.getHashSize();
 
         HashAlgorithm ha = HashAlgorithm.fromEcmaId(keyData.getHashAlgorithm().toString());
         setHashAlgorithm(ha);
 
         if (getHashAlgorithm().hashSize != hashSize) {
-            throw new EncryptedDocumentException("Unsupported hash algorithm: " + 
+            throw new EncryptedDocumentException("Unsupported hash algorithm: " +
                     keyData.getHashAlgorithm() + " @ " + hashSize + " bytes");
         }
 
         setSpinCount(keyData.getSpinCount());
         setEncryptedVerifier(keyData.getEncryptedVerifierHashInput());
         setSalt(keyData.getSaltValue());
-        setEncryptedKey(keyData.getEncryptedKeyValue()); 
+        setEncryptedKey(keyData.getEncryptedKeyValue());
         setEncryptedVerifierHash(keyData.getEncryptedVerifierHashValue());
 
         int saltSize = keyData.getSaltSize();
         if (saltSize != getSalt().length) {
             throw new EncryptedDocumentException("Invalid salt size");
         }
-        
+
         switch (keyData.getCipherChaining().intValue()) {
             case STCipherChaining.INT_CHAINING_MODE_CBC:
                 setChainingMode(ChainingMode.cbc);
@@ -107,11 +114,11 @@ public class AgileEncryptionVerifier ext
             default:
                 throw new EncryptedDocumentException("Unsupported chaining mode - "+ keyData.getCipherChaining());
         }
-        
+
         if (!encList.hasNext()) {
             return;
         }
-        
+
         try {
             CertificateFactory cf = CertificateFactory.getInstance("X.509");
             while (encList.hasNext()) {
@@ -126,7 +133,7 @@ public class AgileEncryptionVerifier ext
             throw new EncryptedDocumentException("can't parse X509 certificate", e);
         }
     }
-    
+
     public AgileEncryptionVerifier(CipherAlgorithm cipherAlgorithm, HashAlgorithm hashAlgorithm, int keyBits, int blockSize, ChainingMode chainingMode) {
         setCipherAlgorithm(cipherAlgorithm);
         setHashAlgorithm(hashAlgorithm);
@@ -135,7 +142,14 @@ public class AgileEncryptionVerifier ext
         setBlockSize(blockSize);
         setSpinCount(100000); // TODO: use parameter
     }
-    
+
+    public AgileEncryptionVerifier(AgileEncryptionVerifier other) {
+        super(other);
+        keyBits = other.keyBits;
+        blockSize = other.blockSize;
+        other.certList.stream().map(AgileCertificateEntry::new).forEach(certList::add);
+    }
+
     @Override
     protected void setSalt(byte[] salt) {
         if (salt == null || salt.length != getCipherAlgorithm().blockSize) {
@@ -143,7 +157,7 @@ public class AgileEncryptionVerifier ext
         }
         super.setSalt(salt);
     }
-    
+
     // make method visible for this package
     @Override
     protected void setEncryptedVerifier(byte[] encryptedVerifier) {
@@ -161,26 +175,23 @@ public class AgileEncryptionVerifier ext
     protected void setEncryptedKey(byte[] encryptedKey) {
         super.setEncryptedKey(encryptedKey);
     }
-    
+
     public void addCertificate(X509Certificate x509) {
         AgileCertificateEntry ace = new AgileCertificateEntry();
         ace.x509 = x509;
         certList.add(ace);
     }
-    
+
     public List<AgileCertificateEntry> getCertificates() {
         return certList;
     }
 
     @Override
-    public AgileEncryptionVerifier clone() throws CloneNotSupportedException {
-        AgileEncryptionVerifier other = (AgileEncryptionVerifier)super.clone();
-        // TODO: deep copy of certList
-        other.certList = new ArrayList<>(certList);
-        return other;
+    public AgileEncryptionVerifier copy() {
+        return new AgileEncryptionVerifier(this);
     }
-    
-    
+
+
     /**
      * The keysize (in bits) of the verifier data. This usually equals the keysize of the header,
      * but only on a few exceptions, like files generated by Office for Mac, can be
@@ -192,7 +203,7 @@ public class AgileEncryptionVerifier ext
         return keyBits;
     }
 
-    
+
     /**
      * The blockSize (in bytes) of the verifier data.
      * This usually equals the blocksize of the header.
@@ -202,7 +213,7 @@ public class AgileEncryptionVerifier ext
     public int getBlockSize() {
         return blockSize;
     }
-    
+
     /**
      * Sets the keysize (in bits) of the verifier
      *
@@ -218,7 +229,7 @@ public class AgileEncryptionVerifier ext
         throw new EncryptedDocumentException("KeySize "+keyBits+" not allowed for cipher "+getCipherAlgorithm());
     }
 
-    
+
     /**
      * Sets the blockSize (in bytes) of the verifier
      *

Modified: poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptor.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptor.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptor.java Sun Dec 22 21:44:45 2019
@@ -49,6 +49,17 @@ import javax.crypto.Mac;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
 
+import com.microsoft.schemas.office.x2006.encryption.CTDataIntegrity;
+import com.microsoft.schemas.office.x2006.encryption.CTEncryption;
+import com.microsoft.schemas.office.x2006.encryption.CTKeyData;
+import com.microsoft.schemas.office.x2006.encryption.CTKeyEncryptor;
+import com.microsoft.schemas.office.x2006.encryption.CTKeyEncryptors;
+import com.microsoft.schemas.office.x2006.encryption.EncryptionDocument;
+import com.microsoft.schemas.office.x2006.encryption.STCipherAlgorithm;
+import com.microsoft.schemas.office.x2006.encryption.STCipherChaining;
+import com.microsoft.schemas.office.x2006.encryption.STHashAlgorithm;
+import com.microsoft.schemas.office.x2006.keyEncryptor.certificate.CTCertificateKeyEncryptor;
+import com.microsoft.schemas.office.x2006.keyEncryptor.password.CTPasswordKeyEncryptor;
 import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.poifs.crypt.ChunkedCipherOutputStream;
 import org.apache.poi.poifs.crypt.CryptoFunctions;
@@ -65,28 +76,21 @@ import org.apache.poi.util.LittleEndianB
 import org.apache.poi.util.LittleEndianConsts;
 import org.apache.xmlbeans.XmlOptions;
 
-import com.microsoft.schemas.office.x2006.encryption.CTDataIntegrity;
-import com.microsoft.schemas.office.x2006.encryption.CTEncryption;
-import com.microsoft.schemas.office.x2006.encryption.CTKeyData;
-import com.microsoft.schemas.office.x2006.encryption.CTKeyEncryptor;
-import com.microsoft.schemas.office.x2006.encryption.CTKeyEncryptors;
-import com.microsoft.schemas.office.x2006.encryption.EncryptionDocument;
-import com.microsoft.schemas.office.x2006.encryption.STCipherAlgorithm;
-import com.microsoft.schemas.office.x2006.encryption.STCipherChaining;
-import com.microsoft.schemas.office.x2006.encryption.STHashAlgorithm;
-import com.microsoft.schemas.office.x2006.keyEncryptor.certificate.CTCertificateKeyEncryptor;
-import com.microsoft.schemas.office.x2006.keyEncryptor.password.CTPasswordKeyEncryptor;
-
-public class AgileEncryptor extends Encryptor implements Cloneable {
+public class AgileEncryptor extends Encryptor {
 
     //arbitrarily selected; may need to increase
     private static final int MAX_RECORD_LENGTH = 1_000_000;
 
     private byte[] integritySalt;
     private byte[] pwHash;
-    
-	protected AgileEncryptor() {
-	}
+
+	protected AgileEncryptor() {}
+
+    protected AgileEncryptor(AgileEncryptor other) {
+	    super(other);
+	    integritySalt = (other.integritySalt == null) ? null : other.integritySalt.clone();
+	    pwHash = (other.pwHash == null) ? null : other.pwHash.clone();
+    }
 
     @Override
     public void confirmPassword(String password) {
@@ -96,7 +100,7 @@ public class AgileEncryptor extends Encr
         int blockSize = header.getBlockSize();
         int keySize = header.getKeySize()/8;
         int hashSize = header.getHashAlgorithm().hashSize;
-        
+
         byte[] newVerifierSalt = IOUtils.safelyAllocate(blockSize, MAX_RECORD_LENGTH)
              , newVerifier = IOUtils.safelyAllocate(blockSize, MAX_RECORD_LENGTH)
              , newKeySalt = IOUtils.safelyAllocate(blockSize, MAX_RECORD_LENGTH)
@@ -107,10 +111,10 @@ public class AgileEncryptor extends Encr
         r.nextBytes(newKeySalt); // blocksize
         r.nextBytes(newKeySpec); // keysize
         r.nextBytes(newIntegritySalt); // hashsize
-        
+
         confirmPassword(password, newKeySpec, newKeySalt, newVerifierSalt, newVerifier, newIntegritySalt);
     }
-	
+
 	@Override
     public void confirmPassword(String password, byte[] keySpec, byte[] keySalt, byte[] verifier, byte[] verifierSalt, byte[] integritySalt) {
         AgileEncryptionVerifier ver = (AgileEncryptionVerifier)getEncryptionInfo().getVerifier();
@@ -120,9 +124,9 @@ public class AgileEncryptor extends Encr
         header.setKeySalt(keySalt);
 
         int blockSize = header.getBlockSize();
-	    
+
         pwHash = hashPassword(password, ver.getHashAlgorithm(), verifierSalt, ver.getSpinCount());
-        
+
         /**
          * encryptedVerifierHashInput: This attribute MUST be generated by using the following steps:
          * 1. Generate a random array of bytes with the number of bytes used specified by the saltSize
@@ -138,7 +142,7 @@ public class AgileEncryptor extends Encr
          */
         byte[] encryptedVerifier = hashInput(ver, pwHash, kVerifierInputBlock, verifier, Cipher.ENCRYPT_MODE);
         ver.setEncryptedVerifier(encryptedVerifier);
-	    
+
 
         /**
          * encryptedVerifierHashValue: This attribute MUST be generated by using the following steps:
@@ -156,7 +160,7 @@ public class AgileEncryptor extends Encr
         byte[] hashedVerifier = hashMD.digest(verifier);
         byte[] encryptedVerifierHash = hashInput(ver, pwHash, kHashedVerifierBlock, hashedVerifier, Cipher.ENCRYPT_MODE);
         ver.setEncryptedVerifierHash(encryptedVerifierHash);
-        
+
         /**
          * encryptedKeyValue: This attribute MUST be generated by using the following steps:
          * 1. Generate a random array of bytes that is the same size as specified by the
@@ -172,13 +176,13 @@ public class AgileEncryptor extends Encr
          */
         byte[] encryptedKey = hashInput(ver, pwHash, kCryptoKeyBlock, keySpec, Cipher.ENCRYPT_MODE);
         ver.setEncryptedKey(encryptedKey);
-        
+
         SecretKey secretKey = new SecretKeySpec(keySpec, header.getCipherAlgorithm().jceId);
         setSecretKey(secretKey);
-        
+
         /*
          * 2.3.4.14 DataIntegrity Generation (Agile Encryption)
-         * 
+         *
          * The DataIntegrity element contained within an Encryption element MUST be generated by using
          * the following steps:
          * 1. Obtain the intermediate key by decrypting the encryptedKeyValue from a KeyEncryptor
@@ -198,7 +202,7 @@ public class AgileEncryptor extends Encr
          *    used as the message.
          * 6. Encrypt the HMAC as in step 3 by using a blockKey byte array consisting of the following bytes:
          *    0xa0, 0x67, 0x7f, 0x02, 0xb2, 0x2c, 0x84, and 0x33.
-         * 7.  Assign the encryptedHmacValue attribute to the base64-encoded form of the result of step 6. 
+         * 7.  Assign the encryptedHmacValue attribute to the base64-encoded form of the result of step 6.
          */
         this.integritySalt = integritySalt.clone();
 
@@ -221,7 +225,7 @@ public class AgileEncryptor extends Encr
             throw new EncryptedDocumentException(e);
         }
 	}
-	
+
     @Override
     public OutputStream getDataStream(DirectoryNode dir)
             throws IOException, GeneralSecurityException {
@@ -230,11 +234,11 @@ public class AgileEncryptor extends Encr
     }
 
     /**
-     * Generate an HMAC, as specified in [RFC2104], of the encrypted form of the data (message), 
-     * which the DataIntegrity element will verify by using the Salt generated in step 2 as the key. 
-     * Note that the entire EncryptedPackage stream (1), including the StreamSize field, MUST be 
+     * Generate an HMAC, as specified in [RFC2104], of the encrypted form of the data (message),
+     * which the DataIntegrity element will verify by using the Salt generated in step 2 as the key.
+     * Note that the entire EncryptedPackage stream (1), including the StreamSize field, MUST be
      * used as the message.
-     * 
+     *
      * Encrypt the HMAC as in step 3 by using a blockKey byte array consisting of the following bytes:
      * 0xa0, 0x67, 0x7f, 0x02, 0xb2, 0x2c, 0x84, and 0x33.
      **/
@@ -266,22 +270,22 @@ public class AgileEncryptor extends Encr
         byte[] iv = CryptoFunctions.generateIv(header.getHashAlgorithm(), header.getKeySalt(), kIntegrityValueBlock, blockSize);
         Cipher cipher = CryptoFunctions.getCipher(getSecretKey(), header.getCipherAlgorithm(), header.getChainingMode(), iv, Cipher.ENCRYPT_MODE);
         byte[] encryptedHmacValue = cipher.doFinal(hmacValueFilled);
-        
+
         header.setEncryptedHmacValue(encryptedHmacValue);
     }
-    
-    private final CTKeyEncryptor.Uri.Enum passwordUri = 
+
+    private final CTKeyEncryptor.Uri.Enum passwordUri =
         CTKeyEncryptor.Uri.HTTP_SCHEMAS_MICROSOFT_COM_OFFICE_2006_KEY_ENCRYPTOR_PASSWORD;
-    private final CTKeyEncryptor.Uri.Enum certificateUri = 
+    private final CTKeyEncryptor.Uri.Enum certificateUri =
         CTKeyEncryptor.Uri.HTTP_SCHEMAS_MICROSOFT_COM_OFFICE_2006_KEY_ENCRYPTOR_CERTIFICATE;
-    
+
     protected EncryptionDocument createEncryptionDocument() {
         AgileEncryptionVerifier ver = (AgileEncryptionVerifier)getEncryptionInfo().getVerifier();
-        AgileEncryptionHeader header = (AgileEncryptionHeader)getEncryptionInfo().getHeader(); 
-        
+        AgileEncryptionHeader header = (AgileEncryptionHeader)getEncryptionInfo().getHeader();
+
         EncryptionDocument ed = EncryptionDocument.Factory.newInstance();
         CTEncryption edRoot = ed.addNewEncryption();
-        
+
         CTKeyData keyData = edRoot.addNewKeyData();
         CTKeyEncryptors keyEncList = edRoot.addNewKeyEncryptors();
         CTKeyEncryptor keyEnc = keyEncList.addNewKeyEncryptor();
@@ -289,10 +293,10 @@ public class AgileEncryptor extends Encr
         CTPasswordKeyEncryptor keyPass = keyEnc.addNewEncryptedPasswordKey();
 
         keyPass.setSpinCount(ver.getSpinCount());
-        
+
         keyData.setSaltSize(header.getBlockSize());
         keyPass.setSaltSize(ver.getBlockSize());
-        
+
         keyData.setBlockSize(header.getBlockSize());
         keyPass.setBlockSize(ver.getBlockSize());
 
@@ -312,9 +316,9 @@ public class AgileEncryptor extends Encr
         }
         keyData.setCipherAlgorithm(xmlCipherAlgo);
         keyPass.setCipherAlgorithm(xmlCipherAlgo);
-        
+
         switch (header.getChainingMode()) {
-        case cbc: 
+        case cbc:
             keyData.setCipherChaining(STCipherChaining.CHAINING_MODE_CBC);
             keyPass.setCipherChaining(STCipherChaining.CHAINING_MODE_CBC);
             break;
@@ -325,7 +329,7 @@ public class AgileEncryptor extends Encr
         default:
             throw new EncryptedDocumentException("ChainingMode "+header.getChainingMode()+" not supported.");
         }
-        
+
         keyData.setHashAlgorithm(mapHashAlgorithm(header.getHashAlgorithm()));
         keyPass.setHashAlgorithm(mapHashAlgorithm(ver.getHashAlgorithm()));
 
@@ -334,11 +338,11 @@ public class AgileEncryptor extends Encr
         keyPass.setEncryptedVerifierHashInput(ver.getEncryptedVerifier());
         keyPass.setEncryptedVerifierHashValue(ver.getEncryptedVerifierHash());
         keyPass.setEncryptedKeyValue(ver.getEncryptedKey());
-        
+
         CTDataIntegrity hmacData = edRoot.addNewDataIntegrity();
         hmacData.setEncryptedHmacKey(header.getEncryptedHmacKey());
         hmacData.setEncryptedHmacValue(header.getEncryptedHmacValue());
-        
+
         for (AgileCertificateEntry ace : ver.getCertificates()) {
             keyEnc = keyEncList.addNewKeyEncryptor();
             keyEnc.setUri(certificateUri);
@@ -351,7 +355,7 @@ public class AgileEncryptor extends Encr
             certData.setEncryptedKeyValue(ace.encryptedKey);
             certData.setCertVerifier(ace.certVerifier);
         }
-        
+
         return ed;
     }
 
@@ -362,7 +366,7 @@ public class AgileEncryptor extends Encr
         }
         return xmlHashAlgo;
     }
-    
+
     protected void marshallEncryptionDocument(EncryptionDocument ed, LittleEndianByteArrayOutputStream os) {
         XmlOptions xo = new XmlOptions();
         xo.setCharacterEncoding("UTF-8");
@@ -396,7 +400,7 @@ public class AgileEncryptor extends Encr
         EncryptionRecord er = new EncryptionRecord(){
             @Override
             public void write(LittleEndianByteArrayOutputStream bos) {
-                // EncryptionVersionInfo (4 bytes): A Version structure (section 2.1.4), where 
+                // EncryptionVersionInfo (4 bytes): A Version structure (section 2.1.4), where
                 // Version.vMajor MUST be 0x0004 and Version.vMinor MUST be 0x0004
                 bos.writeShort(info.getVersionMajor());
                 bos.writeShort(info.getVersionMinor());
@@ -407,14 +411,14 @@ public class AgileEncryptor extends Encr
                 marshallEncryptionDocument(ed, bos);
             }
         };
-        
+
         createEncryptionEntry(dir, "EncryptionInfo", er);
     }
-    
-    
+
+
     /**
      * 2.3.4.15 Data Encryption (Agile Encryption)
-     * 
+     *
      * The EncryptedPackage stream (1) MUST be encrypted in 4096-byte segments to facilitate nearly
      * random access while allowing CBC modes to be used in the encryption process.
      * The initialization vector for the encryption process MUST be obtained by using the zero-based
@@ -431,7 +435,7 @@ public class AgileEncryptor extends Encr
         public AgileCipherOutputStream(DirectoryNode dir) throws IOException, GeneralSecurityException {
             super(dir, 4096);
         }
-        
+
         @Override
         protected Cipher initCipherForBlock(Cipher existing, int block, boolean lastChunk)
         throws GeneralSecurityException {
@@ -442,9 +446,9 @@ public class AgileEncryptor extends Encr
         protected void calculateChecksum(File fileOut, int oleStreamSize)
         throws GeneralSecurityException, IOException {
             // integrityHMAC needs to be updated before the encryption document is created
-            updateIntegrityHMAC(fileOut, oleStreamSize); 
+            updateIntegrityHMAC(fileOut, oleStreamSize);
         }
-        
+
         @Override
         protected void createEncryptionInfoEntry(DirectoryNode dir, File tmpFile)
         throws IOException, GeneralSecurityException {
@@ -453,10 +457,7 @@ public class AgileEncryptor extends Encr
     }
 
     @Override
-    public AgileEncryptor clone() throws CloneNotSupportedException {
-        AgileEncryptor other = (AgileEncryptor)super.clone();
-        other.integritySalt = (integritySalt == null) ? null : integritySalt.clone();
-        other.pwHash = (pwHash == null) ? null : pwHash.clone();
-        return other;
+    public AgileEncryptor copy() {
+        return new AgileEncryptor(this);
     }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java Sun Dec 22 21:44:45 2019
@@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel;
 
 import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
 
+import org.apache.poi.common.Duplicatable;
 import org.apache.poi.ooxml.POIXMLException;
 import org.apache.poi.ss.usermodel.BorderStyle;
 import org.apache.poi.ss.usermodel.CellStyle;
@@ -29,6 +30,7 @@ import org.apache.poi.ss.usermodel.Index
 import org.apache.poi.ss.usermodel.ReadingOrder;
 import org.apache.poi.ss.usermodel.VerticalAlignment;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.Removal;
 import org.apache.poi.xssf.model.StylesTable;
 import org.apache.poi.xssf.model.ThemesTable;
 import org.apache.poi.xssf.usermodel.extensions.XSSFCellAlignment;
@@ -56,7 +58,7 @@ import org.openxmlformats.schemas.spread
  * @see org.apache.poi.xssf.usermodel.XSSFWorkbook#getCellStyleAt(int)
  * @see org.apache.poi.xssf.usermodel.XSSFCell#setCellStyle(org.apache.poi.ss.usermodel.CellStyle)
  */
-public class XSSFCellStyle implements CellStyle {
+public class XSSFCellStyle implements CellStyle, Duplicatable {
 
     private int _cellXfId;
     private final StylesTable _stylesSource;
@@ -1303,6 +1305,14 @@ public class XSSFCellStyle implements Ce
         return _cellXf.toString().equals(cf.getCoreXf().toString());
     }
 
+    @Override
+    @SuppressWarnings("squid:S2975")
+    @Deprecated
+    @Removal(version = "5.0.0")
+    public XSSFCellStyle clone() {
+        return copy();
+    }
+
     /**
      * Make a copy of this style. The underlying CTXf bean is cloned,
      * the references to fills and borders remain.
@@ -1310,7 +1320,7 @@ public class XSSFCellStyle implements Ce
      * @return a copy of this style
      */
     @Override
-    public Object clone(){
+    public XSSFCellStyle copy(){
         CTXf xf = (CTXf)_cellXf.copy();
 
         int xfSize = _stylesSource._getStyleXfsSize();



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