/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.client.events; import java.util.Date; import freenet.client.async.ClientRequester; import freenet.support.CurrentTimeUTC; import freenet.support.LogThresholdCallback; import freenet.support.Logger; import freenet.support.Logger.LogLevel; public class SplitfileProgressEvent implements ClientEvent { private static volatile boolean logMINOR; static { Logger.registerLogThresholdCallback(new LogThresholdCallback(){ @Override public void shouldUpdate(){ logMINOR = Logger.shouldLog(LogLevel.MINOR, this); } }); } public final static int CODE = 0x07; public final int totalBlocks; public final int succeedBlocks; /** @see ClientRequester#latestSuccess */ public final Date latestSuccess; public final int failedBlocks; public final int fatallyFailedBlocks; /** @see ClientRequester#latestFailure */ public final Date latestFailure; public final int minSuccessFetchBlocks; public int minSuccessfulBlocks; public final boolean finalizedTotal; public SplitfileProgressEvent(int totalBlocks, int succeedBlocks, Date latestSuccess, int failedBlocks, int fatallyFailedBlocks, Date latestFailure, int minSuccessfulBlocks, int minSuccessFetchBlocks, boolean finalizedTotal) { this.totalBlocks = totalBlocks; this.succeedBlocks = succeedBlocks; // clone() because Date is mutable. this.latestSuccess = latestSuccess != null ? (Date)latestSuccess.clone() : null; this.failedBlocks = failedBlocks; this.fatallyFailedBlocks = fatallyFailedBlocks; // clone() because Date is mutable. this.latestFailure = latestFailure != null ? (Date)latestFailure.clone() : null; this.minSuccessfulBlocks = minSuccessfulBlocks; this.finalizedTotal = finalizedTotal; this.minSuccessFetchBlocks = minSuccessFetchBlocks; if(logMINOR) Logger.minor(this, "Created SplitfileProgressEvent: total="+totalBlocks+" succeed="+succeedBlocks+" failed="+failedBlocks+" fatally="+fatallyFailedBlocks+" min success="+minSuccessfulBlocks+" finalized="+finalizedTotal); } protected SplitfileProgressEvent() { // For serialization. totalBlocks = 0; succeedBlocks = 0; // See ClientRequester.getLatestSuccess() for why this defaults to current time. latestSuccess = CurrentTimeUTC.get(); failedBlocks = 0; fatallyFailedBlocks = 0; latestFailure = null; minSuccessFetchBlocks = 0; finalizedTotal = false; } /** TODO: Developer's tools: Include {@link #latestSuccess} and {@link #latestFailure}. */ @Override public String getDescription() { StringBuilder sb = new StringBuilder(); sb.append("Completed "); if((minSuccessfulBlocks == 0) && (succeedBlocks == 0)) minSuccessfulBlocks = 1; if(minSuccessfulBlocks == 0) { if(LogLevel.MINOR.matchesThreshold(Logger.globalGetThresholdNew())) Logger.error(this, "minSuccessfulBlocks=0, succeedBlocks="+succeedBlocks+", totalBlocks="+totalBlocks+ ", failedBlocks="+failedBlocks+", fatallyFailedBlocks="+fatallyFailedBlocks+", finalizedTotal="+finalizedTotal, new Exception("debug")); else Logger.error(this, "minSuccessfulBlocks=0, succeedBlocks="+succeedBlocks+", totalBlocks="+totalBlocks+ ", failedBlocks="+failedBlocks+", fatallyFailedBlocks="+fatallyFailedBlocks+", finalizedTotal="+finalizedTotal); } else { sb.append((100*(succeedBlocks)/minSuccessfulBlocks)); sb.append('%'); } sb.append(' '); sb.append(succeedBlocks); sb.append('/'); sb.append(minSuccessfulBlocks); sb.append(" (failed "); sb.append(failedBlocks); sb.append(", fatally "); sb.append(fatallyFailedBlocks); sb.append(", total "); sb.append(totalBlocks); sb.append(", minSuccessFetch "); sb.append(minSuccessFetchBlocks); sb.append(") "); sb.append(finalizedTotal ? " (finalized total)" : ""); return sb.toString(); } @Override public int getCode() { return CODE; } }