org.neo4j.kernel.diagnostics.ProgressAwareInputStream Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of neo4j-kernel Show documentation
Show all versions of neo4j-kernel Show documentation
Neo4j kernel is a lightweight, embedded Java database designed to
store data structured as graphs rather than tables. For more
information, see http://neo4j.org.
/*
* Copyright (c) "Neo4j"
* Neo4j Sweden AB [https://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package org.neo4j.kernel.diagnostics;
import java.io.IOException;
import java.io.InputStream;
/**
* Implements an {@link InputStream} that keeps track of the progress. This assumes that the total size is available
* before reading starts.
*/
class ProgressAwareInputStream extends InputStream {
private final OnProgressListener listener;
private final InputStream wrappedInputStream;
private final long size;
private long totalRead;
private int lastReportedPercent;
ProgressAwareInputStream(InputStream wrappedInputStream, long size, OnProgressListener listener) {
this.wrappedInputStream = wrappedInputStream;
this.size = size;
this.listener = listener;
}
@Override
public int read() throws IOException {
int data = wrappedInputStream.read();
if (data >= 0) {
totalRead += 1;
recalculatePercent();
}
return data;
}
@Override
public int read(byte[] b) throws IOException {
int n = wrappedInputStream.read(b);
if (n > 0) {
totalRead += n;
recalculatePercent();
}
return n;
}
@Override
public int read(byte[] b, int offset, int length) throws IOException {
int n = wrappedInputStream.read(b, offset, length);
if (n > 0) {
totalRead += n;
recalculatePercent();
}
return n;
}
private void recalculatePercent() {
int percent = size > 0 ? (int) (totalRead * 100 / size) : -1;
if (percent > 100) {
percent = 100;
}
if (percent < 0) {
percent = 0;
}
if (percent > lastReportedPercent) {
lastReportedPercent = percent;
listener.onProgress(percent);
}
}
@Override
public long skip(long n) throws IOException {
return wrappedInputStream.skip(n);
}
@Override
public int available() throws IOException {
return wrappedInputStream.available();
}
@Override
public void close() throws IOException {
wrappedInputStream.close();
}
@Override
public synchronized void mark(int readLimit) {
wrappedInputStream.mark(readLimit);
}
@Override
public synchronized void reset() throws IOException {
wrappedInputStream.reset();
}
@Override
public boolean markSupported() {
return wrappedInputStream.markSupported();
}
/**
* Interface for classes that want to monitor this input stream
*/
public interface OnProgressListener {
void onProgress(int percentage);
}
}