package org.jboss.windup.exec; import javax.enterprise.inject.Vetoed; import org.apache.commons.lang3.mutable.MutableInt; import org.jboss.windup.config.AbstractRuleProvider; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.RuleLifecycleListener; import org.jboss.windup.config.RuleUtils; import org.jboss.windup.config.metadata.RuleMetadataType; import org.ocpsoft.rewrite.config.Configuration; import org.ocpsoft.rewrite.config.Rule; import org.ocpsoft.rewrite.context.Context; import org.ocpsoft.rewrite.context.EvaluationContext; /** * * @author <a href="mailto:ozizka@redhat.com">Ondrej Zizka</a> */ @Vetoed class DefaultRuleLifecycleListener implements RuleLifecycleListener { private final WindupProgressMonitor progressMonitor; private final Configuration configuration; private String lastRuleProgressMessage = null; public DefaultRuleLifecycleListener(WindupProgressMonitor progressMonitor, Configuration configuration) { this.progressMonitor = progressMonitor; this.configuration = configuration; } @Override public void beforeExecution(GraphRewrite event) { final org.apache.commons.lang3.mutable.MutableInt count = new MutableInt(0); // Only count rulesets that are not disabled. for (Rule rule : configuration.getRules()) { count.increment(); Context ruleContext = rule instanceof Context ? (Context) rule : null; if (rule == null) return; AbstractRuleProvider ruleProvider = (AbstractRuleProvider) ruleContext.get(RuleMetadataType.RULE_PROVIDER); if (ruleProvider == null) return; if (ruleProvider.getMetadata().isDisabled()) count.decrement(); } progressMonitor.beginTask("Executing Windup", count.intValue()); progressMonitor.worked(1); } @Override public boolean beforeRuleEvaluation(GraphRewrite event, Rule rule, EvaluationContext context) { progressMonitor.subTask(RuleUtils.prettyPrintRule(rule)); return progressMonitor.isCancelled(); } @Override public boolean ruleEvaluationProgress(GraphRewrite event, String name, int currentPosition, int total, int timeRemainingInSeconds) { String timeRemaining = formatTimeRemaining(timeRemainingInSeconds); int percentage = (int) (100 * ((double) currentPosition / (double) total)); String newProgressMessage = "(" + percentage + "%) " + name + ", Estimated time until next Rule: " + timeRemaining; // don't redisplay it if nothing has changed if (!newProgressMessage.equals(lastRuleProgressMessage)) { if (lastRuleProgressMessage != null && lastRuleProgressMessage.length() > newProgressMessage.length()) { newProgressMessage = String.format("%1$-" + lastRuleProgressMessage.length() + "s", newProgressMessage); } lastRuleProgressMessage = newProgressMessage; progressMonitor.subTask(newProgressMessage + "\r"); } return progressMonitor.isCancelled(); } private String formatTimeRemaining(int timeRemainingInSeconds) { int hours = timeRemainingInSeconds / 60 / 60; int minutes = (timeRemainingInSeconds - (hours * 60 * 60)) / 60; int seconds = timeRemainingInSeconds % 60; StringBuilder result = new StringBuilder(); if (hours > 0) result.append(hours).append(" hours, "); if (hours > 0 || minutes > 0) result.append(minutes).append(" minutes, "); result.append(seconds).append(" seconds"); return result.toString(); } @Override public void afterRuleConditionEvaluation(GraphRewrite event, EvaluationContext context, Rule rule, boolean result) { if (result == false) { progressMonitor.worked(1); } } @Override public boolean beforeRuleOperationsPerformed(GraphRewrite event, EvaluationContext context, Rule rule) { return progressMonitor.isCancelled(); } @Override public void afterRuleOperationsPerformed(GraphRewrite event, EvaluationContext context, Rule rule) { progressMonitor.worked(1); } @Override public void afterRuleExecutionFailed(GraphRewrite event, EvaluationContext context, Rule rule, Throwable failureCause) { } @Override public void afterExecution(GraphRewrite event) { progressMonitor.done(); } }