diff --git a/src/main/java/org/dita/dost/invoker/ConversionArguments.java b/src/main/java/org/dita/dost/invoker/ConversionArguments.java index 4d1f317030..3242c8d9e4 100644 --- a/src/main/java/org/dita/dost/invoker/ConversionArguments.java +++ b/src/main/java/org/dita/dost/invoker/ConversionArguments.java @@ -79,6 +79,7 @@ public class ConversionArguments extends Arguments { * Project file */ File projectFile; + int repeat = 1; public final List inputs = new ArrayList<>(); private final List resources = new ArrayList<>(); @@ -142,6 +143,8 @@ ConversionArguments parse(final String[] arguments) { handleArgFilter(arg, args, ARGUMENTS.get(getArgumentName(arg))); } else if (isLongForm(arg, "-resource") || arg.equals("-r")) { handleArgResource(arg, args, ARGUMENTS.get(getArgumentName(arg))); + } else if (isLongForm(arg, "-repeat")) { + handleArgRepeat(arg, args); } else if (ARGUMENTS.containsKey(getArgumentName(arg))) { definedProps.putAll(handleParameterArg(arg, args, ARGUMENTS.get(getArgumentName(arg)))); } else if (getPluginArguments().containsKey(getArgumentName(arg))) { @@ -301,6 +304,14 @@ private void handleArgPropertyFile(final String arg, final Deque args) { propertyFiles.addElement(entry.getValue()); } + private void handleArgRepeat(final String arg, final Deque args) { + final Map.Entry entry = parse(arg.substring(2), args); + if (entry.getValue() == null) { + throw new BuildException("You must repeat number"); + } + repeat = Integer.parseInt(entry.getValue()); + } + /** * Handle the --nice argument. */ @@ -378,6 +389,7 @@ void printUsage(final boolean compact) { buf .options("l", "logfile", "file", locale.getString("conversion.option.logfile")) .options(null, "propertyfile", "file", locale.getString("conversion.option.propertyfile")) + .options(null, "repeat", "num", locale.getString("conversion.option.repeat")) .options("t", "temp", "dir", locale.getString("conversion.option.temp")); final Set builtin = ARGUMENTS.values().stream().map(arg -> arg.property).collect(Collectors.toSet()); final List params = toList(Plugins.getPluginConfiguration().getElementsByTagName("param")); diff --git a/src/main/java/org/dita/dost/invoker/Main.java b/src/main/java/org/dita/dost/invoker/Main.java index 34df78dd9b..34d2ac8e73 100644 --- a/src/main/java/org/dita/dost/invoker/Main.java +++ b/src/main/java/org/dita/dost/invoker/Main.java @@ -95,6 +95,7 @@ public class Main extends org.apache.tools.ant.Main implements AntMain { * Set of properties that can be used by tasks. */ private List> projectProps; + private int repeat; /** * Whether or not this instance has successfully been constructed and is @@ -195,15 +196,27 @@ public void startAnt(final String[] args, final Properties additionalUserPropert // expect the worst int exitCode = 1; try { - try { - for (Map props : projectProps) { - runBuild(coreLoader, props); + final long[] durations = new long[repeat]; + for (int i = 0; i < repeat; i++) { + final long start = System.currentTimeMillis(); + try { + for (Map props : projectProps) { + runBuild(coreLoader, props); + } + exitCode = 0; + } catch (final ExitStatusException ese) { + exitCode = ese.getStatus(); + if (exitCode != 0) { + throw ese; + } } - exitCode = 0; - } catch (final ExitStatusException ese) { - exitCode = ese.getStatus(); - if (exitCode != 0) { - throw ese; + final long end = System.currentTimeMillis(); + durations[i] = end - start; + } + if (repeat > 1) { + for (int i = 0; i < durations.length; i++) { + System.out.println(String.format(locale.getString("conversion.repeatDuration"), + i + 1, durations[i])); } } } catch (final BuildException be) { @@ -344,6 +357,7 @@ private void processArgs(final String[] arguments) { } else { projectProps = handleProject(conversionArgs.projectFile, definedProps); } + repeat = conversionArgs.repeat; // default values if (!definedProps.containsKey(ANT_OUTPUT_DIR)) { definedProps.put(ANT_OUTPUT_DIR, new File(new File("."), "out").getAbsolutePath()); diff --git a/src/main/resources/cli_en_US.properties b/src/main/resources/cli_en_US.properties index 597a4292c5..8d239917e5 100644 --- a/src/main/resources/cli_en_US.properties +++ b/src/main/resources/cli_en_US.properties @@ -47,6 +47,8 @@ conversion.option.filter=Filter and flagging files. This option can be passed mu conversion.option.output=Output directory conversion.option.logfile=Write log messages to file conversion.option.propertyfile=Load all properties from file +conversion.option.repeat=Performs the transformation N times +conversion.repeatDuration=%d %dms conversion.option.temp=Temporary directory conversion.error.input_and_transformation_not_defined=Input file and transformation type not defined conversion.error.transformation_not_defined=Transformation type not defined