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 [12/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/poifs/crypt/cryptoapi/CryptoAPIEncryptor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/cryptoapi/CryptoAPIEncryptor.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/cryptoapi/CryptoAPIEncryptor.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/cryptoapi/CryptoAPIEncryptor.java Sun Dec 22 21:44:45 2019
@@ -46,11 +46,15 @@ import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.StringUtil;
 
-public class CryptoAPIEncryptor extends Encryptor implements Cloneable {
-    
+public class CryptoAPIEncryptor extends Encryptor {
+
     private int chunkSize = 512;
-    
-    CryptoAPIEncryptor() {
+
+    CryptoAPIEncryptor() {}
+
+    CryptoAPIEncryptor(CryptoAPIEncryptor other) {
+        super(other);
+        chunkSize = other.chunkSize;
     }
 
     @Override
@@ -98,31 +102,31 @@ public class CryptoAPIEncryptor extends
     public Cipher initCipherForBlock(Cipher cipher, int block)
     throws GeneralSecurityException {
         return CryptoAPIDecryptor.initCipherForBlock(cipher, block, getEncryptionInfo(), getSecretKey(), Cipher.ENCRYPT_MODE);
-    }    
+    }
 
     @Override
     public ChunkedCipherOutputStream getDataStream(DirectoryNode dir) throws IOException {
         throw new IOException("not supported");
     }
-    
+
     @Override
     public CryptoAPICipherOutputStream getDataStream(OutputStream stream, int initialOffset)
     throws IOException, GeneralSecurityException {
         return new CryptoAPICipherOutputStream(stream);
     }
-    
+
     /**
      * Encrypt the Document-/SummaryInformation and other optionally streams.
      * Opposed to other crypto modes, cryptoapi is record based and can't be used
      * to stream-encrypt a whole file
-     * 
+     *
      * @see <a href="http://msdn.microsoft.com/en-us/library/dd943321(v=office.12).aspx">2.3.5.4 RC4 CryptoAPI Encrypted Summary Stream</a>
      */
     public void setSummaryEntries(DirectoryNode dir, String encryptedStream, POIFSFileSystem entries)
     throws IOException, GeneralSecurityException {
         CryptoAPIDocumentOutputStream bos = new CryptoAPIDocumentOutputStream(this); // NOSONAR
         byte[] buf = new byte[8];
-        
+
         bos.write(buf, 0, 8); // skip header
         List<StreamDescriptorEntry> descList = new ArrayList<>();
 
@@ -137,24 +141,24 @@ public class CryptoAPIEncryptor extends
             descEntry.streamName = entry.getName();
             descEntry.flags = StreamDescriptorEntry.flagStream.setValue(0, 1);
             descEntry.reserved2 = 0;
-            
+
             bos.setBlock(block);
             DocumentInputStream dis = dir.createDocumentInputStream(entry);
             IOUtils.copy(dis, bos);
             dis.close();
-            
+
             descEntry.streamSize = bos.size() - descEntry.streamOffset;
             descList.add(descEntry);
-            
+
             block++;
         }
-        
+
         int streamDescriptorArrayOffset = bos.size();
-        
+
         bos.setBlock(0);
         LittleEndian.putUInt(buf, 0, descList.size());
         bos.write(buf, 0, 4);
-        
+
         for (StreamDescriptorEntry sde : descList) {
             LittleEndian.putUInt(buf, 0, sde.streamOffset);
             bos.write(buf, 0, 4);
@@ -173,7 +177,7 @@ public class CryptoAPIEncryptor extends
             LittleEndian.putShort(buf, 0, (short)0); // null-termination
             bos.write(buf, 0, 2);
         }
-        
+
         int savedSize = bos.size();
         int streamDescriptorArraySize = savedSize - streamDescriptorArrayOffset;
         LittleEndian.putUInt(buf, 0, streamDescriptorArrayOffset);
@@ -183,7 +187,7 @@ public class CryptoAPIEncryptor extends
         bos.setBlock(0);
         bos.write(buf, 0, 8);
         bos.setSize(savedSize);
-        
+
         dir.createDocument(encryptedStream, new ByteArrayInputStream(bos.getBuf(), 0, savedSize));
     }
 
@@ -195,10 +199,10 @@ public class CryptoAPIEncryptor extends
     public void setChunkSize(int chunkSize) {
         this.chunkSize = chunkSize;
     }
-    
+
     @Override
-    public CryptoAPIEncryptor clone() throws CloneNotSupportedException {
-        return (CryptoAPIEncryptor)super.clone();
+    public CryptoAPIEncryptor copy() {
+        return new CryptoAPIEncryptor(this);
     }
 
     protected class CryptoAPICipherOutputStream extends ChunkedCipherOutputStream {

Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardDecryptor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardDecryptor.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardDecryptor.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardDecryptor.java Sun Dec 22 21:44:45 2019
@@ -43,10 +43,14 @@ import org.apache.poi.util.LittleEndian;
 
 /**
  */
-public class StandardDecryptor extends Decryptor implements Cloneable {
+public class StandardDecryptor extends Decryptor {
     private long _length = -1;
 
-    protected StandardDecryptor() {
+    protected StandardDecryptor() {}
+
+    protected StandardDecryptor(StandardDecryptor other) {
+        super(other);
+        _length = other._length;
     }
 
     @Override
@@ -68,7 +72,7 @@ public class StandardDecryptor extends D
             // ... The number of bytes used by the encrypted Verifier hash MUST be 32 ...
             // TODO: check and trim/pad the hashes to 32
             byte[] verifierHash = Arrays.copyOf(decryptedVerifierHash, calcVerifierHash.length);
-    
+
             if (Arrays.equals(calcVerifierHash, verifierHash)) {
                 setSecretKey(skey);
                 return true;
@@ -79,7 +83,7 @@ public class StandardDecryptor extends D
             throw new EncryptedDocumentException(e);
         }
     }
-    
+
     protected static SecretKey generateSecretKey(String password, EncryptionVerifier ver, int keySize) {
         HashAlgorithm hashAlgo = ver.getHashAlgorithm();
 
@@ -95,7 +99,7 @@ public class StandardDecryptor extends D
         byte[] x3 = new byte[x1.length + x2.length];
         System.arraycopy(x1, 0, x3, 0, x1.length);
         System.arraycopy(x2, 0, x3, x1.length, x2.length);
-        
+
         byte[] key = Arrays.copyOf(x3, keySize);
 
         return new SecretKeySpec(key, ver.getCipherAlgorithm().jceId);
@@ -131,12 +135,12 @@ public class StandardDecryptor extends D
             verifyPassword(null);
         }
         // limit wrong calculated ole entries - (bug #57080)
-        // standard encryption always uses aes encoding, so blockSize is always 16 
+        // standard encryption always uses aes encoding, so blockSize is always 16
         // http://stackoverflow.com/questions/3283787/size-of-data-after-aes-encryption
         int blockSize = getEncryptionInfo().getHeader().getCipherAlgorithm().blockSize;
         long cipherLen = (_length/blockSize + 1) * blockSize;
         Cipher cipher = getCipher(getSecretKey());
-        
+
         InputStream boundedDis = new BoundedInputStream(dis, cipherLen);
         return new BoundedInputStream(new CipherInputStream(boundedDis, cipher), _length);
     }
@@ -153,7 +157,7 @@ public class StandardDecryptor extends D
     }
 
     @Override
-    public StandardDecryptor clone() throws CloneNotSupportedException {
-        return (StandardDecryptor)super.clone();
+    public StandardDecryptor copy() {
+        return new StandardDecryptor(this);
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptionHeader.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptionHeader.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptionHeader.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptionHeader.java Sun Dec 22 21:44:45 2019
@@ -34,7 +34,11 @@ import org.apache.poi.util.LittleEndianI
 import org.apache.poi.util.LittleEndianOutput;
 import org.apache.poi.util.StringUtil;
 
-public class StandardEncryptionHeader extends EncryptionHeader implements EncryptionRecord, Cloneable {
+public class StandardEncryptionHeader extends EncryptionHeader implements EncryptionRecord {
+
+    protected StandardEncryptionHeader(StandardEncryptionHeader other) {
+        super(other);
+    }
 
     protected StandardEncryptionHeader(LittleEndianInput is) throws IOException {
         setFlags(is.readInt());
@@ -67,7 +71,7 @@ public class StandardEncryptionHeader ex
         } else {
             ((InputStream)is).reset();
         }
-        
+
         if (checkForSalt == 16) {
             setCspName("");
         } else {
@@ -81,7 +85,7 @@ public class StandardEncryptionHeader ex
             }
             setCspName(builder.toString());
         }
-        
+
         setChainingMode(ChainingMode.ecb);
         setKeySalt(null);
     }
@@ -97,9 +101,9 @@ public class StandardEncryptionHeader ex
         // see http://msdn.microsoft.com/en-us/library/windows/desktop/bb931357(v=vs.85).aspx for a full list
         // setCspName("Microsoft Enhanced RSA and AES Cryptographic Provider");
     }
-    
+
     /**
-     * serializes the header 
+     * serializes the header
      */
     @Override
     public void write(LittleEndianByteArrayOutputStream bos) {
@@ -120,11 +124,11 @@ public class StandardEncryptionHeader ex
         bos.write(StringUtil.getToUnicodeLE(cspName));
         bos.writeShort(0);
         int headerSize = bos.getWriteIndex()-startIdx-LittleEndianConsts.INT_SIZE;
-        sizeOutput.writeInt(headerSize);        
+        sizeOutput.writeInt(headerSize);
     }
 
     @Override
-    public StandardEncryptionHeader clone() throws CloneNotSupportedException {
-        return (StandardEncryptionHeader)super.clone();
+    public StandardEncryptionHeader copy() {
+        return new StandardEncryptionHeader(this);
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptionVerifier.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptionVerifier.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptionVerifier.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptionVerifier.java Sun Dec 22 21:44:45 2019
@@ -25,12 +25,12 @@ import org.apache.poi.util.LittleEndianB
 import org.apache.poi.util.LittleEndianInput;
 
 /**
- * Used when checking if a key is valid for a document 
+ * Used when checking if a key is valid for a document
  */
-public class StandardEncryptionVerifier extends EncryptionVerifier implements EncryptionRecord, Cloneable {
+public class StandardEncryptionVerifier extends EncryptionVerifier implements EncryptionRecord {
     private static final int SPIN_COUNT = 50000;
     private final int verifierHashSize;
-    
+
     protected StandardEncryptionVerifier(LittleEndianInput is, StandardEncryptionHeader header) {
         int saltSize = is.readInt();
 
@@ -56,9 +56,9 @@ public class StandardEncryptionVerifier
         setCipherAlgorithm(header.getCipherAlgorithm());
         setChainingMode(header.getChainingMode());
         setEncryptedKey(null);
-        setHashAlgorithm(header.getHashAlgorithm()); 
+        setHashAlgorithm(header.getHashAlgorithm());
     }
-    
+
     protected StandardEncryptionVerifier(CipherAlgorithm cipherAlgorithm, HashAlgorithm hashAlgorithm, int keyBits, int blockSize, ChainingMode chainingMode) {
         setCipherAlgorithm(cipherAlgorithm);
         setHashAlgorithm(hashAlgorithm);
@@ -67,6 +67,11 @@ public class StandardEncryptionVerifier
         verifierHashSize = hashAlgorithm.hashSize;
     }
 
+    protected StandardEncryptionVerifier(StandardEncryptionVerifier other) {
+        super(other);
+        verifierHashSize = other.verifierHashSize;
+    }
+
     // make method visible for this package
     @Override
     protected void setSalt(byte[] salt) {
@@ -75,7 +80,7 @@ public class StandardEncryptionVerifier
         }
         super.setSalt(salt);
     }
-    
+
     // make method visible for this package
     @Override
     protected void setEncryptedVerifier(byte[] encryptedVerifier) {
@@ -87,7 +92,7 @@ public class StandardEncryptionVerifier
     protected void setEncryptedVerifierHash(byte[] encryptedVerifierHash) {
         super.setEncryptedVerifierHash(encryptedVerifierHash);
     }
-    
+
     @Override
     public void write(LittleEndianByteArrayOutputStream bos) {
         // see [MS-OFFCRYPTO] - 2.3.4.9
@@ -95,7 +100,7 @@ public class StandardEncryptionVerifier
         assert(salt.length == 16);
         bos.writeInt(salt.length); // salt size
         bos.write(salt);
-        
+
         // The resulting Verifier value MUST be an array of 16 bytes.
         byte[] encryptedVerifier = getEncryptedVerifier();
         assert(encryptedVerifier.length == 16);
@@ -121,7 +126,7 @@ public class StandardEncryptionVerifier
     }
 
     @Override
-    public StandardEncryptionVerifier clone() throws CloneNotSupportedException {
-        return (StandardEncryptionVerifier)super.clone();
+    public StandardEncryptionVerifier copy() {
+        return new StandardEncryptionVerifier(this);
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptor.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptor.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptor.java Sun Dec 22 21:44:45 2019
@@ -53,11 +53,14 @@ import org.apache.poi.util.POILogFactory
 import org.apache.poi.util.POILogger;
 import org.apache.poi.util.TempFile;
 
-public class StandardEncryptor extends Encryptor implements Cloneable {
+public class StandardEncryptor extends Encryptor {
     private static final POILogger logger = POILogFactory.getLogger(StandardEncryptor.class);
 
-    protected StandardEncryptor() {
-    }    
+    protected StandardEncryptor() {}
+
+    protected StandardEncryptor(StandardEncryptor other) {
+        super(other);
+    }
 
     @Override
     public void confirmPassword(String password) {
@@ -66,15 +69,15 @@ public class StandardEncryptor extends E
         byte[] salt = new byte[16], verifier = new byte[16];
         r.nextBytes(salt);
         r.nextBytes(verifier);
-        
+
         confirmPassword(password, null, null, salt, verifier, null);
     }
-    
-    
+
+
     /**
      * Fills the fields of verifier and header with the calculated hashes based
      * on the password and a random salt
-     * 
+     *
      * see [MS-OFFCRYPTO] - 2.3.4.7 ECMA-376 Document Encryption Key Generation
      */
     @Override
@@ -85,35 +88,35 @@ public class StandardEncryptor extends E
         SecretKey secretKey = generateSecretKey(password, ver, getKeySizeInBytes());
         setSecretKey(secretKey);
         Cipher cipher = getCipher(secretKey, null);
-        
+
         try {
             byte[] encryptedVerifier = cipher.doFinal(verifier);
             MessageDigest hashAlgo = CryptoFunctions.getMessageDigest(ver.getHashAlgorithm());
             byte[] calcVerifierHash = hashAlgo.digest(verifier);
-            
+
             // 2.3.3 EncryptionVerifier ...
-            // An array of bytes that contains the encrypted form of the 
-            // hash of the randomly generated Verifier value. The length of the array MUST be the size of 
-            // the encryption block size multiplied by the number of blocks needed to encrypt the hash of the 
-            // Verifier. If the encryption algorithm is RC4, the length MUST be 20 bytes. If the encryption 
+            // An array of bytes that contains the encrypted form of the
+            // hash of the randomly generated Verifier value. The length of the array MUST be the size of
+            // the encryption block size multiplied by the number of blocks needed to encrypt the hash of the
+            // Verifier. If the encryption algorithm is RC4, the length MUST be 20 bytes. If the encryption
             // algorithm is AES, the length MUST be 32 bytes. After decrypting the EncryptedVerifierHash
             // field, only the first VerifierHashSize bytes MUST be used.
             int encVerHashSize = ver.getCipherAlgorithm().encryptedVerifierHashLength;
             byte[] encryptedVerifierHash = cipher.doFinal(Arrays.copyOf(calcVerifierHash, encVerHashSize));
-    
+
             ver.setEncryptedVerifier(encryptedVerifier);
             ver.setEncryptedVerifierHash(encryptedVerifierHash);
         } catch (GeneralSecurityException e) {
             throw new EncryptedDocumentException("Password confirmation failed", e);
         }
-        
+
     }
 
     private Cipher getCipher(SecretKey key, String padding) {
         EncryptionVerifier ver = getEncryptionInfo().getVerifier();
         return CryptoFunctions.getCipher(key, ver.getCipherAlgorithm(), ver.getChainingMode(), null, Cipher.ENCRYPT_MODE, padding);
     }
-    
+
     @Override
     public OutputStream getDataStream(final DirectoryNode dir)
     throws IOException, GeneralSecurityException {
@@ -121,7 +124,7 @@ public class StandardEncryptor extends E
         DataSpaceMapUtils.addDefaultDataSpace(dir);
         return new StandardCipherOutputStream(dir);
     }
-    
+
     protected class StandardCipherOutputStream extends FilterOutputStream implements POIFSWriterListener {
         protected long countBytes;
         protected final File fileOut;
@@ -137,19 +140,19 @@ public class StandardEncryptor extends E
             // see also [MS-OFFCRYPT] - 2.3.4.15
             // The final data block MUST be padded to the next integral multiple of the
             // KeyData.blockSize value. Any padding bytes can be used. Note that the StreamSize
-            // field of the EncryptedPackage field specifies the number of bytes of 
+            // field of the EncryptedPackage field specifies the number of bytes of
             // unencrypted data as specified in section 2.3.4.4.
             super(
-                new CipherOutputStream(new FileOutputStream(fileOut), getCipher(getSecretKey(), "PKCS5Padding"))   
+                new CipherOutputStream(new FileOutputStream(fileOut), getCipher(getSecretKey(), "PKCS5Padding"))
             );
             this.fileOut = fileOut;
             this.dir = dir;
         }
-        
+
         protected StandardCipherOutputStream(DirectoryNode dir) throws IOException {
             this(dir, TempFile.createTempFile("encrypted_package", "crypt"));
         }
-        
+
         @Override
         public void write(byte[] b, int off, int len) throws IOException {
             out.write(b, off, len);
@@ -161,28 +164,28 @@ public class StandardEncryptor extends E
             out.write(b);
             countBytes++;
         }
-    
+
         @Override
         public void close() throws IOException {
             // the CipherOutputStream adds the padding bytes on close()
-            super.close(); 
+            super.close();
             writeToPOIFS();
         }
-        
+
         void writeToPOIFS() throws IOException {
             int oleStreamSize = (int)(fileOut.length()+LittleEndianConsts.LONG_SIZE);
             dir.createDocument(DEFAULT_POIFS_ENTRY, oleStreamSize, this);
             // TODO: any properties???
         }
-    
+
         @Override
         public void processPOIFSWriterEvent(POIFSWriterEvent event) {
             try {
                 LittleEndianOutputStream leos = new LittleEndianOutputStream(event.getStream());
 
-                // StreamSize (8 bytes): An unsigned integer that specifies the number of bytes used by data 
-                // encrypted within the EncryptedData field, not including the size of the StreamSize field. 
-                // Note that the actual size of the \EncryptedPackage stream (1) can be larger than this 
+                // StreamSize (8 bytes): An unsigned integer that specifies the number of bytes used by data
+                // encrypted within the EncryptedData field, not including the size of the StreamSize field.
+                // Note that the actual size of the \EncryptedPackage stream (1) can be larger than this
                 // value, depending on the block size of the chosen encryption algorithm
                 leos.writeLong(countBytes);
 
@@ -199,16 +202,16 @@ public class StandardEncryptor extends E
             }
         }
     }
-    
+
     protected int getKeySizeInBytes() {
         return getEncryptionInfo().getHeader().getKeySize()/8;
     }
-    
+
     protected void createEncryptionInfoEntry(DirectoryNode dir) throws IOException {
         final EncryptionInfo info = getEncryptionInfo();
         final StandardEncryptionHeader header = (StandardEncryptionHeader)info.getHeader();
         final StandardEncryptionVerifier verifier = (StandardEncryptionVerifier)info.getVerifier();
-        
+
         EncryptionRecord er = new EncryptionRecord(){
             @Override
             public void write(LittleEndianByteArrayOutputStream bos) {
@@ -219,14 +222,14 @@ public class StandardEncryptor extends E
                 verifier.write(bos);
             }
         };
-        
+
         createEncryptionEntry(dir, "EncryptionInfo", er);
-        
+
         // TODO: any properties???
     }
 
     @Override
-    public StandardEncryptor clone() throws CloneNotSupportedException {
-        return (StandardEncryptor)super.clone();
+    public StandardEncryptor copy() {
+        return new StandardEncryptor(this);
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XORDecryptor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XORDecryptor.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XORDecryptor.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XORDecryptor.java Sun Dec 22 21:44:45 2019
@@ -33,11 +33,16 @@ import org.apache.poi.poifs.crypt.Encryp
 import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.util.LittleEndian;
 
-public class XORDecryptor extends Decryptor implements Cloneable {
+public class XORDecryptor extends Decryptor {
     private long length = -1L;
     private int chunkSize = 512;
 
-    protected XORDecryptor() {
+    protected XORDecryptor() {}
+
+    protected XORDecryptor(XORDecryptor other) {
+        super(other);
+        length = other.length;
+        chunkSize = other.chunkSize;
     }
 
     @Override
@@ -93,23 +98,23 @@ public class XORDecryptor extends Decryp
     public void setChunkSize(int chunkSize) {
         this.chunkSize = chunkSize;
     }
-    
+
     @Override
-    public XORDecryptor clone() throws CloneNotSupportedException {
-        return (XORDecryptor)super.clone();
+    public XORDecryptor copy() {
+        return new XORDecryptor(this);
     }
 
     private class XORCipherInputStream extends ChunkedCipherInputStream {
         private final int initialOffset;
         private int recordStart;
         private int recordEnd;
-        
+
         public XORCipherInputStream(InputStream stream, int initialPos)
                 throws GeneralSecurityException {
             super(stream, Integer.MAX_VALUE, chunkSize);
             this.initialOffset = initialPos;
         }
-        
+
         @Override
         protected Cipher initCipherForBlock(Cipher existing, int block)
                 throws GeneralSecurityException {
@@ -123,19 +128,19 @@ public class XORDecryptor extends Decryp
             final byte[] chunk = getChunk();
             final byte[] plain = getPlain();
             final int posInChunk = pos & getChunkMask();
-            
+
             /*
              * From: http://social.msdn.microsoft.com/Forums/en-US/3dadbed3-0e68-4f11-8b43-3a2328d9ebd5
-             * 
+             *
              * The initial value for XorArrayIndex is as follows:
              * XorArrayIndex = (FileOffset + Data.Length) % 16
-             * 
+             *
              * The FileOffset variable in this context is the stream offset into the Workbook stream at
              * the time we are about to write each of the bytes of the record data.
-             * This (the value) is then incremented after each byte is written. 
+             * This (the value) is then incremented after each byte is written.
              */
             final int xorArrayIndex = initialOffset+recordEnd+(pos-recordStart);
-            
+
             for (int i=0; pos+i < recordEnd && i < totalBytes; i++) {
                 // The following is taken from the Libre Office implementation
                 // It seems that the encrypt and decrypt method is mixed up
@@ -149,16 +154,16 @@ public class XORDecryptor extends Decryp
             // the other bytes will be encoded, when setNextRecordSize is called the next time
             return totalBytes;
         }
-        
+
         private byte rotateLeft(byte bits, int shift) {
             return (byte)(((bits & 0xff) << shift) | ((bits & 0xff) >>> (8 - shift)));
         }
-        
-        
+
+
         /**
          * Decrypts a xor obfuscated byte array.
          * The data is decrypted in-place
-         * 
+         *
          * @see <a href="http://msdn.microsoft.com/en-us/library/dd908506.aspx">2.3.7.3 Binary Document XOR Data Transformation Method 1</a>
          */
         @Override

Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptionHeader.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptionHeader.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptionHeader.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptionHeader.java Sun Dec 22 21:44:45 2019
@@ -21,17 +21,21 @@ import org.apache.poi.poifs.crypt.Encryp
 import org.apache.poi.poifs.crypt.standard.EncryptionRecord;
 import org.apache.poi.util.LittleEndianByteArrayOutputStream;
 
-public class XOREncryptionHeader extends EncryptionHeader implements EncryptionRecord, Cloneable {
+public class XOREncryptionHeader extends EncryptionHeader implements EncryptionRecord {
 
     protected XOREncryptionHeader() {
     }
 
+    protected XOREncryptionHeader(XOREncryptionHeader other) {
+        super(other);
+    }
+
     @Override
     public void write(LittleEndianByteArrayOutputStream leos) {
     }
 
     @Override
-    public XOREncryptionHeader clone() throws CloneNotSupportedException {
-        return (XOREncryptionHeader)super.clone();
+    public XOREncryptionHeader copy() {
+        return new XOREncryptionHeader(this);
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptionVerifier.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptionVerifier.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptionVerifier.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptionVerifier.java Sun Dec 22 21:44:45 2019
@@ -22,7 +22,7 @@ import org.apache.poi.poifs.crypt.standa
 import org.apache.poi.util.LittleEndianByteArrayOutputStream;
 import org.apache.poi.util.LittleEndianInput;
 
-public class XOREncryptionVerifier extends EncryptionVerifier implements EncryptionRecord, Cloneable {
+public class XOREncryptionVerifier extends EncryptionVerifier implements EncryptionRecord {
 
     protected XOREncryptionVerifier() {
         setEncryptedKey(new byte[2]);
@@ -31,14 +31,14 @@ public class XOREncryptionVerifier exten
 
     protected XOREncryptionVerifier(LittleEndianInput is) {
         /**
-         * key (2 bytes): An unsigned integer that specifies the obfuscation key. 
+         * key (2 bytes): An unsigned integer that specifies the obfuscation key.
          * See [MS-OFFCRYPTO], 2.3.6.2 section, the first step of initializing XOR
          * array where it describes the generation of 16-bit XorKey value.
          */
         byte[] key = new byte[2];
         is.readFully(key);
         setEncryptedKey(key);
-        
+
         /**
          * verificationBytes (2 bytes): An unsigned integer that specifies
          * the password verification identifier.
@@ -47,7 +47,11 @@ public class XOREncryptionVerifier exten
         is.readFully(verifier);
         setEncryptedVerifier(verifier);
     }
-    
+
+    protected XOREncryptionVerifier(XOREncryptionVerifier other) {
+        super(other);
+    }
+
     @Override
     public void write(LittleEndianByteArrayOutputStream bos) {
         bos.write(getEncryptedKey());
@@ -55,8 +59,8 @@ public class XOREncryptionVerifier exten
     }
 
     @Override
-    public XOREncryptionVerifier clone() throws CloneNotSupportedException {
-        return (XOREncryptionVerifier)super.clone();
+    public XOREncryptionVerifier copy() {
+        return new XOREncryptionVerifier(this);
     }
 
     @Override

Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptor.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptor.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/xor/XOREncryptor.java Sun Dec 22 21:44:45 2019
@@ -33,8 +33,11 @@ import org.apache.poi.poifs.crypt.Encryp
 import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.util.LittleEndian;
 
-public class XOREncryptor extends Encryptor implements Cloneable {
-    protected XOREncryptor() {
+public class XOREncryptor extends Encryptor {
+    protected XOREncryptor() {}
+
+    protected XOREncryptor(XOREncryptor other) {
+        super(other);
     }
 
     @Override
@@ -81,8 +84,8 @@ public class XOREncryptor extends Encryp
     }
 
     @Override
-    public XOREncryptor clone() throws CloneNotSupportedException {
-        return (XOREncryptor)super.clone();
+    public XOREncryptor copy() {
+        return new XOREncryptor(this);
     }
 
     private class XORCipherOutputStream extends ChunkedCipherOutputStream {

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/Formula.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/Formula.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/Formula.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/Formula.java Sun Dec 22 21:44:45 2019
@@ -31,8 +31,6 @@ import org.apache.poi.util.LittleEndianO
 
 /**
  * Encapsulates an encoded formula token array.
- *
- * @author Josh Micich
  */
 public class Formula {
 
@@ -45,6 +43,11 @@ public class Formula {
 	private final byte[] _byteEncoding;
 	private final int _encodedTokenLen;
 
+	public Formula(Formula other) {
+		_byteEncoding = (other._byteEncoding == null) ? null : other._byteEncoding.clone();
+		_encodedTokenLen = other._encodedTokenLen;
+	}
+
 	private Formula(byte[] byteEncoding, int encodedTokenLen) {
 		_byteEncoding = byteEncoding.clone();
 		_encodedTokenLen = encodedTokenLen;

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AbstractFunctionPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AbstractFunctionPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AbstractFunctionPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AbstractFunctionPtg.java Sun Dec 22 21:44:45 2019
@@ -26,8 +26,6 @@ import org.apache.poi.ss.formula.functio
  * This class provides the base functionality for Excel sheet functions
  * There are two kinds of function Ptgs - tFunc and tFuncVar
  * Therefore, this class will have ONLY two subclasses
- * @author  Avik Sengupta
- * @author Andrew C. Oliver (acoliver at apache dot org)
  */
 public abstract class AbstractFunctionPtg extends OperationPtg {
 

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AddPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AddPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AddPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AddPtg.java Sun Dec 22 21:44:45 2019
@@ -18,22 +18,19 @@
 package org.apache.poi.ss.formula.ptg;
 
 /**
- * Addition operator PTG the "+" binomial operator.  If you need more 
- * explanation than that then well...We really can't help you here.
- * @author  Andrew C. Oliver (acoliver@apache.org)
- * @author Jason Height (jheight at chariot dot net dot au)
+ * Addition operator PTG the "+" binomial operator.
  */
 public final class AddPtg extends ValueOperatorPtg {
     public final static byte sid  = 0x03;
-    
+
     private final static String ADD = "+";
 
-    public static final ValueOperatorPtg instance = new AddPtg();
+    public static final AddPtg instance = new AddPtg();
 
     private AddPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -41,8 +38,8 @@ public final class AddPtg extends ValueO
     public int getNumberOfOperands() {
         return 2;
     }
-       
-   /** implementation of method from OperationsPtg*/  
+
+   /** implementation of method from OperationsPtg*/
     public String toFormulaString(String[] operands) {
         StringBuilder buffer = new StringBuilder();
 
@@ -51,4 +48,9 @@ public final class AddPtg extends ValueO
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }
+
+    @Override
+    public AddPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java Sun Dec 22 21:44:45 2019
@@ -30,6 +30,11 @@ public abstract class Area2DPtgBase exte
 	protected Area2DPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
 		super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
 	}
+
+	protected Area2DPtgBase(Area2DPtgBase other) {
+		super(other);
+	}
+
 	protected Area2DPtgBase(AreaReference ar) {
 		super(ar);
 	}

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java Sun Dec 22 21:44:45 2019
@@ -26,13 +26,11 @@ import org.apache.poi.util.LittleEndianI
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * <p>Title:        Area 3D Ptg - 3D reference (Sheet + Area)</p>
- * <p>Description:  Defined an area 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 Area3DPxg}
+ * Area 3D Ptg - 3D reference (Sheet + Area)<p>
+ * Defined an area 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 Area3DPxg}
  */
 public final class Area3DPtg extends AreaPtgBase implements WorkbookDependentFormula, ExternSheetReferenceToken {
 	public final static byte sid = 0x3b;
@@ -46,6 +44,11 @@ public final class Area3DPtg extends Are
 		setExternSheetIndex(externIdx);
 	}
 
+	public Area3DPtg(Area3DPtg other)  {
+		super(other);
+		field_1_index_extern_sheet = other.field_1_index_extern_sheet;
+	}
+
 	public Area3DPtg(LittleEndianInput in)  {
 		field_1_index_extern_sheet = in.readShort();
 		readCoordinates(in);
@@ -104,8 +107,14 @@ public final class Area3DPtg extends Are
 	public String toFormulaString(FormulaRenderingWorkbook book) {
 		return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet, formatReferenceAsString());
 	}
+
 	@Override
 	public String toFormulaString() {
 		throw new RuntimeException("3D references need a workbook to determine formula text");
 	}
+
+	@Override
+	public Area3DPtg copy() {
+		return new Area3DPtg(this);
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java Sun Dec 22 21:44:45 2019
@@ -19,28 +19,34 @@ package org.apache.poi.ss.formula.ptg;
 
 import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.formula.SheetIdentifier;
-import org.apache.poi.ss.formula.SheetNameFormatter;
 import org.apache.poi.ss.formula.SheetRangeAndWorkbookIndexFormatter;
 import org.apache.poi.ss.formula.SheetRangeIdentifier;
 import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * <p>Title:        XSSF Area 3D Reference (Sheet + Area)<P>
- * <p>Description:  Defined an area 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 Area3DPtg}</p>
+ * XSSF Area 3D Reference (Sheet + Area)<p>
+ * Defined an area 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 Area3DPtg}
  */
 public final class Area3DPxg extends AreaPtgBase implements Pxg3D {
     private int externalWorkbookNumber = -1;
     private String firstSheetName;
     private String lastSheetName;
 
+    public Area3DPxg(Area3DPxg other) {
+        super(other);
+        externalWorkbookNumber = other.externalWorkbookNumber;
+        firstSheetName = other.firstSheetName;
+        lastSheetName = other.lastSheetName;
+    }
+
     public Area3DPxg(int externalWorkbookNumber, SheetIdentifier sheetName, String arearef) {
         this(externalWorkbookNumber, sheetName, new AreaReference(arearef, SpreadsheetVersion.EXCEL2007));
     }
+
     public Area3DPxg(int externalWorkbookNumber, SheetIdentifier sheetName, AreaReference arearef) {
         super(arearef);
         this.externalWorkbookNumber = externalWorkbookNumber;
@@ -79,7 +85,7 @@ public final class Area3DPxg extends Are
         sb.append("]");
         return sb.toString();
     }
-    
+
     public int getExternalWorkbookNumber() {
         return externalWorkbookNumber;
     }
@@ -89,7 +95,7 @@ public final class Area3DPxg extends Are
     public String getLastSheetName() {
         return lastSheetName;
     }
-    
+
     public void setSheetName(String sheetName) {
         this.firstSheetName = sheetName;
     }
@@ -100,7 +106,7 @@ public final class Area3DPxg extends Are
     public String format2DRefAsString() {
         return formatReferenceAsString();
     }
-    
+
     public String toFormulaString() {
         StringBuilder sb = new StringBuilder(64);
 
@@ -117,4 +123,8 @@ public final class Area3DPxg extends Are
         throw new IllegalStateException("XSSF-only Ptg, should not be serialised");
     }
 
+    @Override
+    public Area3DPxg copy() {
+        return new Area3DPxg(this);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java Sun Dec 22 21:44:45 2019
@@ -23,8 +23,6 @@ import org.apache.poi.util.LittleEndianO
 
 /**
  * AreaErr - handles deleted cell area references.
- *
- * @author Daniel Noll (daniel at nuix dot com dot au)
  */
 public final class AreaErrPtg extends OperandPtg {
 	public final static byte sid = 0x2B;
@@ -59,5 +57,10 @@ public final class AreaErrPtg extends Op
 	public int getSize() {
 		return 9;
 	}
-}
 
+	@Override
+	public AreaErrPtg copy() {
+		// immutable
+		return this;
+	}
+}
\ No newline at end of file

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java Sun Dec 22 21:44:45 2019
@@ -26,6 +26,10 @@ import org.apache.poi.util.LittleEndianI
 public final class AreaNPtg extends Area2DPtgBase {
 	public final static short sid = 0x2D;
 
+	public AreaNPtg(AreaNPtg other)  {
+		super(other);
+	}
+
 	public AreaNPtg(LittleEndianInput in)  {
 		super(in);
 	}
@@ -33,4 +37,9 @@ public final class AreaNPtg extends Area
 	protected byte getSid() {
 		return sid;
 	}
+
+	@Override
+	public AreaNPtg copy() {
+		return new AreaNPtg(this);
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaPtg.java Sun Dec 22 21:44:45 2019
@@ -22,7 +22,6 @@ import org.apache.poi.util.LittleEndianI
 
 /**
  * Specifies a rectangular area of cells A1:A4 for instance.
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class AreaPtg extends Area2DPtgBase {
 	public final static short sid  = 0x25;
@@ -30,17 +29,26 @@ public final class AreaPtg extends Area2
 	public AreaPtg(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
 		super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
 	}
-	
+
+	public AreaPtg(AreaPtg other)  {
+		super(other);
+	}
+
 	public AreaPtg(LittleEndianInput in)  {
 		super(in);
 	}
-	
+
     public AreaPtg(AreaReference arearef) {
         super(arearef);
     }
-    
+
 	@Override
 	protected byte getSid() {
 		return sid;
 	}
+
+	@Override
+	public AreaPtg copy() {
+		return new AreaPtg(this);
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java Sun Dec 22 21:44:45 2019
@@ -27,17 +27,12 @@ import org.apache.poi.util.LittleEndianO
 
 /**
  * Specifies a rectangular area of cells A1:A4 for instance.
- * @author  andy
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public abstract class AreaPtgBase extends OperandPtg implements AreaI {
-    /**
-     * TODO - (May-2008) fix subclasses of AreaPtg 'AreaN~' which are used in shared formulas.
-     * see similar comment in ReferencePtg
-     */
-    protected final RuntimeException notImplemented() {
-        return new RuntimeException("Coding Error: This method should never be called. This ptg should be converted");
-    }
+
+    private final static BitField rowRelative = BitFieldFactory.getInstance(0x8000);
+    private final static BitField colRelative = BitFieldFactory.getInstance(0x4000);
+    private final static BitField columnMask  = BitFieldFactory.getInstance(0x3FFF);
 
     /** zero based, unsigned 16 bit */
     private int field_1_first_row;
@@ -48,12 +43,14 @@ public abstract class AreaPtgBase extend
     /** zero based, unsigned 8 bit */
     private int field_4_last_column; //BitFields: (last row relative, last col relative, last column number)
 
-    private final static BitField rowRelative = BitFieldFactory.getInstance(0x8000);
-    private final static BitField colRelative = BitFieldFactory.getInstance(0x4000);
-    private final static BitField columnMask  = BitFieldFactory.getInstance(0x3FFF);
+    protected AreaPtgBase() {}
 
-    protected AreaPtgBase() {
-        // do nothing
+    protected AreaPtgBase(AreaPtgBase other) {
+        super(other);
+        field_1_first_row = other.field_1_first_row;
+        field_2_last_row = other.field_2_last_row;
+        field_3_first_column = other.field_3_first_column;
+        field_4_last_column = other.field_4_last_column;
     }
 
     protected AreaPtgBase(AreaReference ar) {
@@ -96,11 +93,11 @@ public abstract class AreaPtgBase extend
             setLastColRelative(firstColRelative);
         }
     }
-    
+
     /**
      * Sort the first and last row and columns in-place to the preferred (top left:bottom right) order
      * Note: Sort only occurs when an instance is constructed or when this method is called.
-     * 
+     *
      * <p>For example, <code>$E5:B$10</code> becomes <code>B5:$E$10</code></p>
      */
     public void sortTopLeftToBottomRight() {

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ArrayPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ArrayPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ArrayPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ArrayPtg.java Sun Dec 22 21:44:45 2019
@@ -31,18 +31,16 @@ import org.apache.poi.util.LittleEndianO
  * It is only after the "size" of all the Ptgs is met, that the ArrayPtg data is actually
  * held after this. So Ptg.createParsedExpression keeps track of the number of
  * ArrayPtg elements and need to parse the data upto the FORMULA record size.
- *
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class ArrayPtg extends Ptg {
-	public static final byte sid  = 0x20;
+	public static final byte sid = 0x20;
 
 	private static final int RESERVED_FIELD_LEN = 7;
 	/**
 	 * The size of the plain tArray token written within the standard formula tokens
 	 * (not including the data which comes after all formula tokens)
 	 */
-	public static final int PLAIN_TOKEN_SIZE = 1+RESERVED_FIELD_LEN;
+	public static final int PLAIN_TOKEN_SIZE = 1 + RESERVED_FIELD_LEN;
 
 	// 7 bytes of data (stored as an int, short and byte here)
 	private final int _reserved0Int;
@@ -50,7 +48,7 @@ public final class ArrayPtg extends Ptg
 	private final int _reserved2Byte;
 
 	// data from these fields comes after the Ptg data of all tokens in current formula
-	private final int  _nColumns;
+	private final int _nColumns;
 	private final int _nRows;
 	private final Object[] _arrayValues;
 
@@ -62,6 +60,16 @@ public final class ArrayPtg extends Ptg
 		_nRows = nRows;
 		_arrayValues = arrayValues.clone();
 	}
+
+	public ArrayPtg(ArrayPtg other) {
+		_reserved0Int = other._reserved0Int;
+		_reserved1Short = other._reserved1Short;
+		_reserved2Byte = other._reserved2Byte;
+		_nColumns = other._nColumns;
+		_nRows = other._nRows;
+		_arrayValues = (other._arrayValues == null) ? null : other._arrayValues.clone();
+	}
+
 	/**
 	 * @param values2d array values arranged in rows
 	 */
@@ -264,5 +272,16 @@ public final class ArrayPtg extends Ptg
 			result.setClass(getPtgClass());
 			return result;
 		}
+
+		@Override
+		public Initial copy() {
+			// immutable
+			return this;
+		}
+	}
+
+	@Override
+	public ArrayPtg copy() {
+		return new ArrayPtg(this);
 	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AttrPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AttrPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AttrPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/AttrPtg.java Sun Dec 22 21:44:45 2019
@@ -24,22 +24,13 @@ import org.apache.poi.util.LittleEndianI
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * "Special Attributes"
+ * "Special Attributes"<p>
  * This seems to be a Misc Stuff and Junk record.  One function it serves is
  * in SUM functions (i.e. SUM(A1:A3) causes an area PTG then an ATTR with the SUM option set)
- * @author  andy
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class AttrPtg extends ControlPtg {
     public final static byte sid  = 0x19;
     private final static int  SIZE = 4;
-    private final byte _options;
-    private final short _data;
-
-    /** only used for tAttrChoose: table of offsets to starts of args */
-    private final int[] _jumpTable;
-    /** only used for tAttrChoose: offset to the tFuncVar for CHOOSE() */
-    private final int   _chooseFuncOffset;
 
     // flags 'volatile' and 'space', can be combined.
     // OOO spec says other combinations are theoretically possible but not likely to occur.
@@ -74,6 +65,14 @@ public final class AttrPtg extends Contr
         public static final int SPACE_AFTER_EQUALITY = 0x06;
     }
 
+    private final byte _options;
+    private final short _data;
+
+    /** only used for tAttrChoose: table of offsets to starts of args */
+    private final int[] _jumpTable;
+    /** only used for tAttrChoose: offset to the tFuncVar for CHOOSE() */
+    private final int   _chooseFuncOffset;
+
     public AttrPtg(LittleEndianInput in) {
         _options = in.readByte();
         _data    = in.readShort();
@@ -259,4 +258,10 @@ public final class AttrPtg extends Contr
       }
       return "UNKNOWN ATTRIBUTE";
      }
+
+    @Override
+    public AttrPtg copy() {
+        // immutable
+        return this;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/BoolPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/BoolPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/BoolPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/BoolPtg.java Sun Dec 22 21:44:45 2019
@@ -22,10 +22,6 @@ import org.apache.poi.util.LittleEndianO
 
 /**
  * Boolean (boolean) Stores a (java) boolean value in a formula.
- *
- * @author Paul Krause (pkrause at soundbite dot com)
- * @author Andrew C. Oliver (acoliver at apache dot org)
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class BoolPtg extends ScalarConstantPtg {
 	public static final int SIZE = 2;
@@ -63,4 +59,9 @@ public final class BoolPtg extends Scala
 	public String toFormulaString() {
 		return _value ? "TRUE" : "FALSE";
 	}
+
+	@Override
+	public BoolPtg copy() {
+		return this;
+	}
 }

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

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ControlPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ControlPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ControlPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ControlPtg.java Sun Dec 22 21:44:45 2019
@@ -17,18 +17,10 @@
 
 package org.apache.poi.ss.formula.ptg;
 
-/**
- * Common superclass for 
- * tExp
- * tTbl
- * tParen
- * tNlr
- * tAttr
- * tSheet
- * tEndSheet
- */
 public abstract class ControlPtg extends Ptg {
 
+	protected ControlPtg() {}
+
 	public boolean isBaseToken() {
 		return true;
 	}

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java Sun Dec 22 21:44:45 2019
@@ -33,6 +33,13 @@ public final class Deleted3DPxg extends
         this.externalWorkbookNumber = externalWorkbookNumber;
         this.sheetName = sheetName;
     }
+
+    public Deleted3DPxg(Deleted3DPxg other) {
+        super(other);
+        externalWorkbookNumber = other.externalWorkbookNumber;
+        sheetName = other.sheetName;
+    }
+
     public Deleted3DPxg(String sheetName) {
         this(-1, sheetName);
     }
@@ -59,7 +66,7 @@ public final class Deleted3DPxg extends
     public String getSheetName() {
         return sheetName;
     }
-    
+
     public void setSheetName(String sheetName) {
         this.sheetName = sheetName;
     }
@@ -78,7 +85,7 @@ public final class Deleted3DPxg extends
         sb.append(FormulaError.REF.getString());
         return sb.toString();
     }
-    
+
     public byte getDefaultOperandClass() {
         return Ptg.CLASS_VALUE;
     }
@@ -89,4 +96,9 @@ public final class Deleted3DPxg extends
     public void write(LittleEndianOutput out) {
         throw new IllegalStateException("XSSF-only Ptg, should not be serialised");
     }
+
+    @Override
+    public Deleted3DPxg copy() {
+        return new Deleted3DPxg(this);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedArea3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedArea3DPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedArea3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedArea3DPtg.java Sun Dec 22 21:44:45 2019
@@ -24,10 +24,9 @@ import org.apache.poi.util.LittleEndianI
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * Title:        Deleted Area 3D Ptg - 3D referecnce (Sheet + Area)<P>
- * Description:  Defined a area in Extern Sheet. <P>
- * REFERENCE:  <P>
- * @author Patrick Luby
+ * Deleted Area 3D Ptg - 3D referecnce (Sheet + Area)<p>
+ * Defined a area in Extern Sheet.
+ *
  * @version 1.0-pre
  */
 public final class DeletedArea3DPtg extends OperandPtg implements WorkbookDependentFormula {
@@ -41,7 +40,7 @@ public final class DeletedArea3DPtg exte
 		unused1 = 0;
 		unused2 = 0;
 	}
-	
+
 	public DeletedArea3DPtg(LittleEndianInput in)  {
 		field_1_index_extern_sheet = in.readUShort();
 		unused1 = in.readInt();
@@ -65,4 +64,10 @@ public final class DeletedArea3DPtg exte
 		out.writeInt(unused1);
 		out.writeInt(unused2);
 	}
+
+	@Override
+	public DeletedArea3DPtg copy() {
+		// immutable
+		return this;
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedRef3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedRef3DPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedRef3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DeletedRef3DPtg.java Sun Dec 22 21:44:45 2019
@@ -25,8 +25,9 @@ import org.apache.poi.util.LittleEndianI
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * Title:        Deleted Reference 3D Ptg <P>
- * Description:  Defined a cell in extern sheet. <P>
+ * Deleted Reference 3D Ptg<p>
+ * Defined a cell in extern sheet.
+ *
  * @since 1.0-pre
  */
 public final class DeletedRef3DPtg extends OperandPtg implements WorkbookDependentFormula {
@@ -62,4 +63,10 @@ public final class DeletedRef3DPtg exten
 		out.writeShort(field_1_index_extern_sheet);
 		out.writeInt(unused1);
 	}
+
+	@Override
+	public DeletedRef3DPtg copy() {
+		// immutable
+		return this;
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DividePtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DividePtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DividePtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/DividePtg.java Sun Dec 22 21:44:45 2019
@@ -19,18 +19,16 @@ package org.apache.poi.ss.formula.ptg;
 
 /**
  * This PTG implements the standard binomial divide "/"
- * @author  Andrew C. Oliver acoliver at apache dot org
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class DividePtg extends ValueOperatorPtg {
     public final static byte sid  = 0x06;
 
-    public static final ValueOperatorPtg instance = new DividePtg();
+    public static final DividePtg instance = new DividePtg();
 
     private DividePtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -46,5 +44,10 @@ public final class DividePtg extends Val
         buffer.append("/");
         buffer.append(operands[ 1 ]);
         return buffer.toString();
-    }      
+    }
+
+    @Override
+    public DividePtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/EqualPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/EqualPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/EqualPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/EqualPtg.java Sun Dec 22 21:44:45 2019
@@ -24,12 +24,12 @@ package org.apache.poi.ss.formula.ptg;
 public final class EqualPtg extends ValueOperatorPtg {
     public final static byte sid  = 0x0b;
 
-    public static final ValueOperatorPtg instance = new EqualPtg();
+    public static final EqualPtg instance = new EqualPtg();
 
     private EqualPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -37,14 +37,19 @@ public final class EqualPtg extends Valu
     public int getNumberOfOperands() {
         return 2;
     }
- 
+
     public String toFormulaString(String[] operands) {
          StringBuilder buffer = new StringBuilder();
 
-        
+
         buffer.append(operands[ 0 ]);
         buffer.append("=");
         buffer.append(operands[ 1 ]);
         return buffer.toString();
-    }       
+    }
+
+    @Override
+    public EqualPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ErrPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ErrPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ErrPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ErrPtg.java Sun Dec 22 21:44:45 2019
@@ -86,4 +86,9 @@ public final class ErrPtg extends Scalar
                 throw new RuntimeException("Unexpected error code (" + code + ")");
         }
     }
+
+    @Override
+    public ErrPtg copy() {
+        return this;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ExpPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ExpPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ExpPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/ExpPtg.java Sun Dec 22 21:44:45 2019
@@ -20,15 +20,10 @@ package org.apache.poi.ss.formula.ptg;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
-/**
- *
- * @author  andy
- * @author Jason Height (jheight at chariot dot net dot au)
- * @author dmui (save existing implementation)
- */
 public final class ExpPtg extends ControlPtg {
     private final static int  SIZE = 5;
     public final static short sid  = 0x1;
+
     private final int field_1_first_row;
     private final int field_2_first_col;
 
@@ -71,4 +66,9 @@ public final class ExpPtg extends Contro
     public String toString() {
         return "[Array Formula or Shared Formula]\n" + "row = " + getRow() + "\n" + "col = " + getColumn() + "\n";
     }
+
+    @Override
+    public ExpPtg copy() {
+        return this;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/FuncPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/FuncPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/FuncPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/FuncPtg.java Sun Dec 22 21:44:45 2019
@@ -22,11 +22,6 @@ import org.apache.poi.ss.formula.functio
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
-/**
- * @author aviks
- * @author Jason Height (jheight at chariot dot net dot au)
- * @author Danny Mui (dmui at apache dot org) (Leftover handling)
- */
 public final class FuncPtg extends AbstractFunctionPtg {
 
     public final static byte sid  = 0x21;
@@ -57,4 +52,10 @@ public final class FuncPtg extends Abstr
     public int getSize() {
         return SIZE;
     }
+
+    @Override
+    public FuncPtg copy() {
+        // immutable
+        return this;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/FuncVarPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/FuncVarPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/FuncVarPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/FuncVarPtg.java Sun Dec 22 21:44:45 2019
@@ -23,10 +23,7 @@ import org.apache.poi.util.BitFieldFacto
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
-/**
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-public final class FuncVarPtg extends AbstractFunctionPtg{
+public final class FuncVarPtg extends AbstractFunctionPtg {
     public final static byte sid  = 0x22;
     private final static int  SIZE = 4;
 
@@ -90,4 +87,10 @@ public final class FuncVarPtg extends Ab
     public int getSize() {
         return SIZE;
     }
+
+    @Override
+    public FuncVarPtg copy() {
+        // immutable
+        return this;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/GreaterEqualPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/GreaterEqualPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/GreaterEqualPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/GreaterEqualPtg.java Sun Dec 22 21:44:45 2019
@@ -20,19 +20,17 @@ package org.apache.poi.ss.formula.ptg;
 
 /**
  * PTG class to implement greater or equal to
- *
- * @author  fred at stsci dot edu
  */
 public final class GreaterEqualPtg extends ValueOperatorPtg {
     public final static int  SIZE = 1;
     public final static byte sid  = 0x0c;
 
-    public static final ValueOperatorPtg instance = new GreaterEqualPtg();
+    public static final GreaterEqualPtg instance = new GreaterEqualPtg();
 
     private GreaterEqualPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -51,4 +49,9 @@ public final class GreaterEqualPtg exten
 
         return buffer.toString();
     }
+
+    @Override
+    public GreaterEqualPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java Sun Dec 22 21:44:45 2019
@@ -20,18 +20,17 @@ package org.apache.poi.ss.formula.ptg;
 
 /**
  * Greater than operator PTG ">"
- * @author  Cameron Riley (criley at ekmail.com)
  */
 public final class GreaterThanPtg extends ValueOperatorPtg {
-    public final static byte sid  = 0x0D;    
+    public final static byte sid  = 0x0D;
     private final static String GREATERTHAN = ">";
 
-    public static final ValueOperatorPtg instance = new GreaterThanPtg();
+    public static final GreaterThanPtg instance = new GreaterThanPtg();
 
     private GreaterThanPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -43,13 +42,13 @@ public final class GreaterThanPtg extend
     public int getNumberOfOperands() {
         return 2;
     }
-    
-    /** 
+
+    /**
      * Implementation of method from OperationsPtg
      * @param operands a String array of operands
      * @return String the Formula as a String
-     */  
-    public String toFormulaString(String[] operands) 
+     */
+    public String toFormulaString(String[] operands)
     {
         StringBuilder buffer = new StringBuilder();
 
@@ -58,4 +57,9 @@ public final class GreaterThanPtg extend
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }
+
+    @Override
+    public GreaterThanPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/IntPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/IntPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/IntPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/IntPtg.java Sun Dec 22 21:44:45 2019
@@ -21,11 +21,7 @@ import org.apache.poi.util.LittleEndianI
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * Integer (unsigned short integer) Stores an unsigned short value (java int) in
- * a formula
- * 
- * @author Andrew C. Oliver (acoliver at apache dot org)
- * @author Jason Height (jheight at chariot dot net dot au)
+ * Integer (unsigned short integer) Stores an unsigned short value (java int) in a formula
  */
 public final class IntPtg extends ScalarConstantPtg {
 	// 16 bit unsigned integer
@@ -34,8 +30,8 @@ public final class IntPtg extends Scalar
 
 	/**
 	 * Excel represents integers 0..65535 with the tInt token.
-	 * 
-	 * @return <code>true</code> if the specified value is within the range of values 
+	 *
+	 * @return <code>true</code> if the specified value is within the range of values
 	 * <tt>IntPtg</tt> can represent.
 	 */
 	public static boolean isInRange(int i) {
@@ -73,4 +69,9 @@ public final class IntPtg extends Scalar
 	public String toFormulaString() {
 		return String.valueOf(getValue());
 	}
+
+	@Override
+	public IntPtg copy() {
+		return this;
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/IntersectionPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/IntersectionPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/IntersectionPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/IntersectionPtg.java Sun Dec 22 21:44:45 2019
@@ -19,13 +19,10 @@ 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 IntersectionPtg extends OperationPtg {
 	public final static byte sid = 0x0f;
 
-	public static final OperationPtg instance = new IntersectionPtg();
+	public static final IntersectionPtg instance = new IntersectionPtg();
 
 	private IntersectionPtg() {
 		// enforce singleton
@@ -59,4 +56,9 @@ public final class IntersectionPtg exten
 	public int getNumberOfOperands() {
 		return 2;
 	}
+
+	@Override
+	public IntersectionPtg copy() {
+		return instance;
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/LessEqualPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/LessEqualPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/LessEqualPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/LessEqualPtg.java Sun Dec 22 21:44:45 2019
@@ -1,4 +1,4 @@
-        
+
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -23,18 +23,16 @@ package org.apache.poi.ss.formula.ptg;
 
 /**
  * Ptg class to implement less than or equal
- *
- * @author fred at stsci dot edu
  */
 public final class LessEqualPtg extends ValueOperatorPtg {
     public final static byte sid = 0x0a;
 
-    public static final ValueOperatorPtg instance = new LessEqualPtg();
+    public static final LessEqualPtg instance = new LessEqualPtg();
 
     private LessEqualPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -50,4 +48,9 @@ public final class LessEqualPtg extends
         buffer.append( operands[1] );
         return buffer.toString();
     }
+
+    @Override
+    public LessEqualPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java Sun Dec 22 21:44:45 2019
@@ -18,24 +18,23 @@
 package org.apache.poi.ss.formula.ptg;
 
 /**
- * Less than operator PTG "<". The SID is taken from the 
+ * Less than operator PTG "<". The SID is taken from the
  * Openoffice.orgs Documentation of the Excel File Format,
  * Table 3.5.7
- * @author Cameron Riley (criley at ekmail.com)
  */
 public final class LessThanPtg extends ValueOperatorPtg {
     /** the sid for the less than operator as hex */
-    public final static byte sid  = 0x09;    
+    public final static byte sid  = 0x09;
 
     /** identifier for LESS THAN char */
     private final static String LESSTHAN = "<";
 
-    public static final ValueOperatorPtg instance = new LessThanPtg();
+    public static final LessThanPtg instance = new LessThanPtg();
 
     private LessThanPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -47,13 +46,13 @@ public final class LessThanPtg extends V
     public int getNumberOfOperands() {
         return 2;
     }
-    
-     /** 
+
+     /**
      * Implementation of method from OperationsPtg
      * @param operands a String array of operands
      * @return String the Formula as a String
-     */  
-    public String toFormulaString(String[] operands) 
+     */
+    public String toFormulaString(String[] operands)
     {
         StringBuilder buffer = new StringBuilder();
         buffer.append(operands[ 0 ]);
@@ -61,4 +60,9 @@ public final class LessThanPtg extends V
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }
+
+    @Override
+    public LessThanPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemAreaPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemAreaPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemAreaPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemAreaPtg.java Sun Dec 22 21:44:45 2019
@@ -20,9 +20,6 @@ package org.apache.poi.ss.formula.ptg;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
-/**
- * @author Daniel Noll (daniel at nuix dot com dot au)
- */
 public final class MemAreaPtg extends OperandPtg {
 	public final static short sid = 0x26;
 	private final static int SIZE = 7;
@@ -71,4 +68,10 @@ public final class MemAreaPtg extends Op
 		sb.append("]");
 		return sb.toString();
 	}
+
+	@Override
+	public MemAreaPtg copy() {
+		// immutable
+		return this;
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemErrPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemErrPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemErrPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemErrPtg.java Sun Dec 22 21:44:45 2019
@@ -20,18 +20,18 @@ package org.apache.poi.ss.formula.ptg;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
-/**
- * 
- * @author andy
- * @author Jason Height (jheight at chariot dot net dot au)
- * @author Daniel Noll (daniel at nuix dot com dot au)
- */
 public final class MemErrPtg extends OperandPtg {
 	public final static short sid = 0x27;
 	private final static int SIZE = 7;
 	private int field_1_reserved;
 	private short field_2_subex_len;
 
+	public MemErrPtg(MemErrPtg other) {
+		super(other);
+		field_1_reserved = other.field_1_reserved;
+		field_2_subex_len = other.field_2_subex_len;
+	}
+
 	public MemErrPtg(LittleEndianInput in)  {
 		field_1_reserved = in.readInt();
 		field_2_subex_len = in.readShort();
@@ -54,4 +54,9 @@ public final class MemErrPtg extends Ope
 	public byte getDefaultOperandClass() {
 		return Ptg.CLASS_VALUE;
 	}
+
+	@Override
+	public MemErrPtg copy() {
+		return new MemErrPtg(this);
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemFuncPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemFuncPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemFuncPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MemFuncPtg.java Sun Dec 22 21:44:45 2019
@@ -20,9 +20,6 @@ package org.apache.poi.ss.formula.ptg;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
-/**
- * @author Glen Stampoultzis (glens at apache.org)
- */
 public final class MemFuncPtg extends OperandPtg {
 
 	public final static byte sid = 0x29;
@@ -72,4 +69,10 @@ public final class MemFuncPtg extends Op
 		sb.append("]");
 		return sb.toString();
 	}
+
+	@Override
+	public MemFuncPtg copy() {
+		// immutable
+		return this;
+	}
 }
\ No newline at end of file

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MissingArgPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MissingArgPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MissingArgPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MissingArgPtg.java Sun Dec 22 21:44:45 2019
@@ -21,10 +21,6 @@ import org.apache.poi.util.LittleEndianO
 
 /**
  * Missing Function Arguments
- * 
- * Avik Sengupta &lt;avik at apache.org&gt;
- * 
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class MissingArgPtg extends ScalarConstantPtg {
 
@@ -48,4 +44,9 @@ public final class MissingArgPtg extends
 	public String toFormulaString() {
 		return " ";
 	}
+
+	@Override
+	public MissingArgPtg copy() {
+		return this;
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MultiplyPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MultiplyPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MultiplyPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/MultiplyPtg.java Sun Dec 22 21:44:45 2019
@@ -18,19 +18,17 @@
 package org.apache.poi.ss.formula.ptg;
 
 /**
- * Implements the standard mathmatical multiplication - *
- * @author  Andrew C. Oliver (acoliver at apache dot org)
- * @author Jason Height (jheight at chariot dot net dot au)
+ * Implements the standard mathematical multiplication "*"
  */
 public final class MultiplyPtg extends ValueOperatorPtg {
     public final static byte sid  = 0x05;
 
-    public static final ValueOperatorPtg instance = new MultiplyPtg();
+    public static final MultiplyPtg instance = new MultiplyPtg();
 
     private MultiplyPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -38,7 +36,7 @@ public final class MultiplyPtg extends V
     public int getNumberOfOperands() {
         return 2;
     }
-    
+
     public String toFormulaString(String[] operands) {
         StringBuilder buffer = new StringBuilder();
 
@@ -46,5 +44,10 @@ public final class MultiplyPtg extends V
         buffer.append("*");
         buffer.append(operands[ 1 ]);
         return buffer.toString();
-    }                  
+    }
+
+    @Override
+    public MultiplyPtg copy() {
+        return instance;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NamePtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NamePtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NamePtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NamePtg.java Sun Dec 22 21:44:45 2019
@@ -24,13 +24,11 @@ import org.apache.poi.util.LittleEndianO
 
 /**
  * See the spec at 2.5.198.76 PtgName
- * 
- * @author andy
- * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class NamePtg extends OperandPtg implements WorkbookDependentFormula {
 	public final static short sid = 0x23;
 	private final static int SIZE = 5;
+
 	/** one-based index to defined name record */
 	private int field_1_label_index;
 	private short field_2_zero; // reserved must be 0
@@ -42,6 +40,12 @@ public final class NamePtg extends Opera
 		field_1_label_index = 1 + nameIndex; // convert to 1-based
 	}
 
+	public NamePtg(NamePtg other) {
+		super(other);
+		field_1_label_index = other.field_1_label_index;
+		field_2_zero = other.field_2_zero;
+	}
+
 	/** Creates new NamePtg */
 	public NamePtg(LittleEndianInput in)  {
 		field_1_label_index = in.readUShort();
@@ -81,4 +85,9 @@ public final class NamePtg extends Opera
 	public byte getDefaultOperandClass() {
 		return Ptg.CLASS_REF;
 	}
+
+	@Override
+	public NamePtg copy() {
+		return new NamePtg(this);
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPtg.java Sun Dec 22 21:44:45 2019
@@ -25,7 +25,7 @@ import org.apache.poi.util.LittleEndianO
 /**
  * A Name, be that a Named Range or a Function / User Defined
  *  Function, addressed in the HSSF External Sheet style.
- *  
+ *
  * <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 NameXPxg}
@@ -77,12 +77,12 @@ public final class NameXPtg extends Oper
 	public String toFormulaString() {
 		throw new RuntimeException("3D references need a workbook to determine formula text");
 	}
-	
+
 	public String toString(){
         return "NameXPtg:[sheetRefIndex:" + _sheetRefIndex +
            " , nameNumber:" + _nameNumber + "]";
 	}
-	
+
 	public byte getDefaultOperandClass() {
 		return Ptg.CLASS_VALUE;
 	}
@@ -93,4 +93,10 @@ public final class NameXPtg extends Oper
 	public int getNameIndex() {
 		return _nameNumber - 1;
 	}
+
+	@Override
+	public NameXPtg copy() {
+		// immutable
+		return this;
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java Sun Dec 22 21:44:45 2019
@@ -23,7 +23,7 @@ import org.apache.poi.util.LittleEndianO
 /**
  * A Name, be that a Named Range or a Function / User Defined
  *  Function, addressed in the HSSF External Sheet style.
- *  
+ *
  * <p>This is XSSF only, as it stores the sheet / book references
  *  in String form. The HSSF equivalent using indexes is {@link NameXPtg}</p>
  */
@@ -37,6 +37,14 @@ public final class NameXPxg extends Oper
         this.sheetName = sheetName;
         this.nameName = nameName;
     }
+
+    public NameXPxg(NameXPxg other) {
+        super(other);
+        externalWorkbookNumber = other.externalWorkbookNumber;
+        sheetName = other.sheetName;
+        nameName = other.nameName;
+    }
+
     public NameXPxg(String sheetName, String nameName) {
         this(-1, sheetName, nameName);
     }
@@ -70,7 +78,7 @@ public final class NameXPxg extends Oper
     public String getNameName() {
         return nameName;
     }
-    
+
     public void setSheetName(String sheetName) {
         this.sheetName = sheetName;
     }
@@ -94,7 +102,7 @@ public final class NameXPxg extends Oper
         sb.append(nameName);
         return sb.toString();
     }
-    
+
     public byte getDefaultOperandClass() {
         return Ptg.CLASS_VALUE;
     }
@@ -105,4 +113,9 @@ public final class NameXPxg extends Oper
     public void write(LittleEndianOutput out) {
         throw new IllegalStateException("XSSF-only Ptg, should not be serialised");
     }
+
+    @Override
+    public NameXPxg copy() {
+        return new NameXPxg(this);
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NotEqualPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NotEqualPtg.java?rev=1871911&r1=1871910&r2=1871911&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NotEqualPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NotEqualPtg.java Sun Dec 22 21:44:45 2019
@@ -19,18 +19,16 @@ package org.apache.poi.ss.formula.ptg;
 
 /**
  * Ptg class to implement not equal
- *
- * @author fred at stsci dot edu
  */
 public final class NotEqualPtg extends ValueOperatorPtg {
     public final static byte sid = 0x0e;
 
-    public static final ValueOperatorPtg instance = new NotEqualPtg();
+    public static final NotEqualPtg instance = new NotEqualPtg();
 
     private NotEqualPtg() {
     	// enforce singleton
     }
-    
+
     protected byte getSid() {
     	return sid;
     }
@@ -49,4 +47,9 @@ public final class NotEqualPtg extends V
 
         return buffer.toString();
     }
+
+    @Override
+    public NotEqualPtg copy() {
+        return instance;
+    }
 }



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