diff --git a/src/main/java/nl/talsmasoftware/umldoclet/javadoc/UMLOptions.java b/src/main/java/nl/talsmasoftware/umldoclet/javadoc/UMLOptions.java index cd857ed71..c880e87ae 100644 --- a/src/main/java/nl/talsmasoftware/umldoclet/javadoc/UMLOptions.java +++ b/src/main/java/nl/talsmasoftware/umldoclet/javadoc/UMLOptions.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 Talsma ICT + * Copyright 2016-2020 Talsma ICT * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ import jdk.javadoc.doclet.Doclet; import jdk.javadoc.doclet.Doclet.Option.Kind; +import net.sourceforge.plantuml.OptionFlags; import nl.talsmasoftware.umldoclet.UMLDoclet; import java.util.Arrays; @@ -91,6 +92,7 @@ private UMLOptions(DocletConfig config, Set standardOptions) { (args) -> config.failOnCyclicPackageDependencies = asBoolean(args.get(0)))); this.options.add(new Option("--uml-java-bean-properties-as-fields -umlJavaBeanPropertiesAsFields", 0, Kind.STANDARD, (args) -> config.methodConfig.javaBeanPropertiesAsFields = true)); + this.options.add(new Option("--uml-timeout -umlTimeout", 1, Kind.STANDARD, this::setTimeout)); } Set mergeWith(final Set standardOptions) { @@ -116,6 +118,15 @@ private static boolean asBoolean(String value) { return "true".equalsIgnoreCase(value); } + private void setTimeout(List timeout) { + try { + int timeoutSeconds = Integer.parseInt(timeout.get(0)); + OptionFlags.getInstance().setTimeoutMs(1000L * timeoutSeconds); + } catch (RuntimeException rte) { + throw new IllegalArgumentException("Unrecognized timeout value: seconds expected, received: " + timeout, rte); + } + } + private class Option implements Doclet.Option { private static final String MISSING_KEY = ""; private final Consumer> processor; diff --git a/src/main/resources/nl/talsmasoftware/umldoclet/UMLDoclet.properties b/src/main/resources/nl/talsmasoftware/umldoclet/UMLDoclet.properties index 2471aeef0..c84bc4f9e 100644 --- a/src/main/resources/nl/talsmasoftware/umldoclet/UMLDoclet.properties +++ b/src/main/resources/nl/talsmasoftware/umldoclet/UMLDoclet.properties @@ -39,3 +39,5 @@ doclet.usage.uml-excluded-package-dependencies.parameters=(,)* doclet.usage.fail-on-cyclic-package-dependencies.description=Fail on cyclic package dependencies (defaults to false) doclet.usage.fail-on-cyclic-package-dependencies.parameters=(true|false) doclet.usage.uml-java-bean-properties-as-fields.description=To render JavaBean getters and setters as fields in UML +doclet.usage.uml-timeout.description=Set a timeout for PlantUML diagram rendering (defaults to '900' / 15 minutes) +doclet.usage.uml-timeout.parameters= diff --git a/src/test/java/nl/talsmasoftware/umldoclet/javadoc/UMLOptionsTest.java b/src/test/java/nl/talsmasoftware/umldoclet/javadoc/UMLOptionsTest.java new file mode 100644 index 000000000..99467a861 --- /dev/null +++ b/src/test/java/nl/talsmasoftware/umldoclet/javadoc/UMLOptionsTest.java @@ -0,0 +1,73 @@ +/* + * Copyright 2016-2020 Talsma ICT + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package nl.talsmasoftware.umldoclet.javadoc; + +import jdk.javadoc.doclet.Doclet; +import net.sourceforge.plantuml.OptionFlags; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.opentest4j.AssertionFailedError; + +import static java.util.Collections.emptySet; +import static java.util.Collections.singletonList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class UMLOptionsTest { + private DocletConfig config; + private UMLOptions umlOptions; + + @BeforeEach + void setUpUmlOptions() { + config = new DocletConfig(); + umlOptions = new UMLOptions(config); + } + + private Doclet.Option docletOption(String name) { + return umlOptions.mergeWith(emptySet()) + .stream() + .filter(o -> o.getNames().contains(name)) + .findFirst() + .orElseThrow(() -> new AssertionFailedError("Doclet option " + name + " not found!")); + } + + @Test + void testUmlTimeoutOption() { + // prepare + Doclet.Option umlTimeoutOption = docletOption("--uml-timeout"); + + // execute + umlTimeoutOption.process("--uml-timeout", singletonList("1800")); + + // verify + assertThat(OptionFlags.getInstance().getTimeoutMs(), is(1000L * 1800)); + } + + @Test + void testIllegalUmlTimeoutOption() { + // prepare + Doclet.Option umlTimeoutOption = docletOption("--uml-timeout"); + + // execute + IllegalArgumentException expected = assertThrows(IllegalArgumentException.class, () -> + umlTimeoutOption.process("--uml-timeout", singletonList("30 minutes"))); + + // verify + assertThat(expected.getMessage(), containsString("timeout value")); + } +}