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 (acoli...@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 <avik at apache.org> - * - * @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-unsubscr...@poi.apache.org For additional commands, e-mail: commits-h...@poi.apache.org