package com.wouterbreukink.onedrive.tasks;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import static com.wouterbreukink.onedrive.LogUtils.readableFileSize;
import static com.wouterbreukink.onedrive.LogUtils.readableTime;
public class TaskReporter {
private static final Logger log = LogManager.getLogger(TaskReporter.class.getName());
private int same;
private int remoteDeleted;
private int localDeleted;
private int skipped;
private int propsUpdated;
private int errors;
private int newUploaded;
private long newUploadedSize;
private int replaceUploaded;
private long replaceUploadedSize;
private int newDownloaded;
private long newDownloadedSize;
private int replaceDownloaded;
private long replaceDownloadedSize;
private long startTime;
public TaskReporter() {
startTime = System.currentTimeMillis();
}
public synchronized void same() {
same++;
}
public synchronized void remoteDeleted() {
remoteDeleted++;
}
public synchronized void localDeleted() {
localDeleted++;
}
public synchronized void skipped() {
skipped++;
}
public synchronized void error() {
errors++;
}
public synchronized void fileUploaded(boolean replace, long size) {
if (replace) {
replaceUploaded++;
replaceUploadedSize += size;
} else {
newUploaded++;
newUploadedSize += size;
}
}
public synchronized void fileDownloaded(boolean replace, long size) {
if (replace) {
replaceDownloaded++;
replaceDownloadedSize += size;
} else {
newDownloaded++;
newDownloadedSize += size;
}
}
public synchronized void propertiesUpdated() {
propsUpdated++;
}
public synchronized void report() {
if (errors > 0) {
log.error(String.format("%d tasks failed - see log for details", errors));
}
if (same > 0) {
log.info(String.format("Skipped %d unchanged file%s", same, plural(same)));
}
if (skipped > 0) {
log.info(String.format("Skipped %d ignored file%s", skipped, plural(skipped)));
}
if (localDeleted > 0) {
log.info(String.format("Deleted %d local file%s", localDeleted, plural(skipped)));
}
if (remoteDeleted > 0) {
log.info(String.format("Deleted %d remote file%s", remoteDeleted, plural(skipped)));
}
if (propsUpdated > 0) {
log.info(String.format("Updated timestamps on %d file%s", propsUpdated, plural(skipped)));
}
if (newUploaded > 0 || replaceUploaded > 0) {
StringBuilder uploadedResult = new StringBuilder();
uploadedResult.append(
String.format("Uploaded %d file%s (%s) - ",
newUploaded + replaceUploaded,
plural(newUploaded + replaceUploaded),
readableFileSize(newUploadedSize + replaceUploadedSize)));
if (newUploaded > 0) {
uploadedResult.append(
String.format("%d new file%s (%s) ",
newUploaded,
plural(newUploaded),
readableFileSize(newUploadedSize)));
}
if (replaceUploaded > 0) {
uploadedResult.append(
String.format("%d new file%s (%s) ",
replaceUploaded,
plural(replaceUploaded),
readableFileSize(replaceUploadedSize)));
}
log.info(uploadedResult.toString());
}
if (newDownloaded > 0 || replaceDownloaded > 0) {
StringBuilder downloadedResult = new StringBuilder();
downloadedResult.append(
String.format("Downloaded %d file%s (%s) - ",
newDownloaded + replaceDownloaded,
plural(newDownloaded + replaceDownloaded),
readableFileSize(newDownloadedSize + replaceDownloadedSize)));
if (newDownloaded > 0) {
downloadedResult.append(
String.format("%d new file%s (%s) ",
newDownloaded,
plural(newDownloaded),
readableFileSize(newDownloadedSize)));
}
if (replaceDownloaded > 0) {
downloadedResult.append(
String.format("%d new file%s (%s) ",
replaceDownloaded,
plural(replaceDownloaded),
readableFileSize(replaceDownloadedSize)));
}
log.info(downloadedResult.toString());
}
long elapsed = System.currentTimeMillis() - startTime;
log.info(String.format("Elapsed time: %s", readableTime(elapsed)));
}
private String plural(long same) {
return same != 1 ? "s" : "";
}
}