151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.net.www; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.URL; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.*; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.ProgressSource; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class MeteredStream extends FilterInputStream { 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Instance variables. 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* if expected != -1, after we've read >= expected, we're "closed" and return -1 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * from subsequest read() 's 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected boolean closed = false; 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected long expected; 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected long count = 0; 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected long markedCount = 0; 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected int markLimit = -1; 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected ProgressSource pi; 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public MeteredStream(InputStream is, ProgressSource pi, long expected) 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(is); 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.pi = pi; 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.expected = expected; 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (pi != null) { 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pi.updateProgress(0, expected); 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final void justRead(long n) throws IOException { 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (n == -1) { 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * don't close automatically when mark is set and is valid; 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cannot reset() after close() 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!isMarked()) { 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski close(); 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski count += n; 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If read beyond the markLimit, invalidate the mark 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (count - markedCount > markLimit) { 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski markLimit = -1; 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (pi != null) 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pi.updateProgress(count, expected); 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (isMarked()) { 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // if expected length is known, we could determine if 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // read overrun. 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (expected > 0) { 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (count >= expected) { 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski close(); 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns true if the mark is valid, false otherwise 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private boolean isMarked() { 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (markLimit < 0) { 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // mark is set, but is not valid anymore 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (count - markedCount > markLimit) { 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // mark still holds 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized int read() throws java.io.IOException { 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (closed) { 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return -1; 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int c = in.read(); 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (c != -1) { 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski justRead(1); 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski justRead(c); 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return c; 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized int read(byte b[], int off, int len) 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws java.io.IOException { 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (closed) { 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return -1; 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int n = in.read(b, off, len); 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski justRead(n); 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return n; 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized long skip(long n) throws IOException { 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND: what does skip do on EOF???? 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (closed) { 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 0; 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 145f0d5c9c93df37348702d5a147877e8c60c408ad0Tobias Thierer // Android-removed: Removed support for Android-removed class ChunkedInputStream. 146f0d5c9c93df37348702d5a147877e8c60c408ad0Tobias Thierer /* 147f0d5c9c93df37348702d5a147877e8c60c408ad0Tobias Thierer if (in instanceof ChunkedInputStream) { 148f0d5c9c93df37348702d5a147877e8c60c408ad0Tobias Thierer n = in.skip(n); 149f0d5c9c93df37348702d5a147877e8c60c408ad0Tobias Thierer } 150f0d5c9c93df37348702d5a147877e8c60c408ad0Tobias Thierer else { 151f0d5c9c93df37348702d5a147877e8c60c408ad0Tobias Thierer */ 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // just skip min(n, num_bytes_left) 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long min = (n > expected - count) ? expected - count: n; 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski n = in.skip(min); 155f0d5c9c93df37348702d5a147877e8c60c408ad0Tobias Thierer // } 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski justRead(n); 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return n; 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 160e31b37859051d3902e06e4ba384995df7188917fHans Boehm // Android-changed: Added synchronize to prevent concurrent finalization. 161e31b37859051d3902e06e4ba384995df7188917fHans Boehm // Since other relevant methods also synchronize on the same object, this prevents 162e31b37859051d3902e06e4ba384995df7188917fHans Boehm // finalization while those methods are running. 163e31b37859051d3902e06e4ba384995df7188917fHans Boehm public synchronized void close() throws IOException { 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (closed) { 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (pi != null) 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pi.finishTracking(); 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski closed = true; 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski in.close(); 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized int available() throws IOException { 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return closed ? 0: in.available(); 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized void mark(int readLimit) { 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (closed) { 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super.mark(readLimit); 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * mark the count to restore upon reset 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski markedCount = count; 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski markLimit = readLimit; 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public synchronized void reset() throws IOException { 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (closed) { 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!isMarked()) { 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException ("Resetting to an invalid mark"); 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski count = markedCount; 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super.reset(); 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean markSupported() { 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (closed) { 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return super.markSupported(); 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void finalize() throws Throwable { 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski close(); 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (pi != null) 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pi.close(); 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski finally { 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Call super class 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super.finalize(); 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 223