package org.jboss.windup.config.operation; import java.util.logging.Logger; import org.jboss.forge.furnace.util.Iterators; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.operation.iteration.AbstractIterationOperation; import org.jboss.windup.graph.model.WindupVertexFrame; import org.jboss.windup.util.Logging; import org.jboss.windup.util.ProgressEstimate; import org.ocpsoft.rewrite.context.EvaluationContext; /** * Provides a simplistic way of printing a message to the log every {@link IterationProgress#interval} iterations. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> * */ public class IterationProgress extends AbstractIterationOperation<WindupVertexFrame> { private static final Logger LOG = Logging.get(IterationProgress.class); private final String messagePrefix; private final int interval; private int totalIterations = -1; private boolean estimateTimeRemaining = true; private ProgressEstimate progressEstimate; private IterationProgress(String messagePrefix, int interval) { this.messagePrefix = messagePrefix; this.interval = interval; } public static IterationProgress monitoring(String messagePrefix, int interval) { return new IterationProgress(messagePrefix, interval); } public IterationProgress disableTimeEstimation() { estimateTimeRemaining = false; return this; } @Override public void perform(GraphRewrite event, EvaluationContext context) { if (totalIterations == -1) { @SuppressWarnings("unchecked") Iterable<WindupVertexFrame> frames = (Iterable<WindupVertexFrame>) event.getRewriteContext().get(Iteration.DEFAULT_VARIABLE_LIST_STRING); totalIterations = Iterators.asList(frames).size(); progressEstimate = new ProgressEstimate(totalIterations); } progressEstimate.addWork(1); if (progressEstimate.getWorked() % interval == 0) { if (estimateTimeRemaining) { long remainingTimeMillis = progressEstimate.getTimeRemainingInMillis(); if (remainingTimeMillis > 1000) event.ruleEvaluationProgress(messagePrefix, progressEstimate.getWorked(), totalIterations, (int) remainingTimeMillis / 1000); } LOG.info(messagePrefix + ": " + progressEstimate.getWorked() + " / " + totalIterations); } } @Override public void perform(GraphRewrite event, EvaluationContext context, WindupVertexFrame payload) { // noop } @Override public String toString() { return "IterationProgress{msg=" + messagePrefix + ", int=" + interval + ", est=" + estimateTimeRemaining + '}'; } }