diff --git a/ditaa/src/main/java/org/asciidoctor/diagram/ditaa/Ditaa.java b/ditaa/src/main/java/org/asciidoctor/diagram/ditaa/Ditaa.java index 4a3d230..abeb1b9 100644 --- a/ditaa/src/main/java/org/asciidoctor/diagram/ditaa/Ditaa.java +++ b/ditaa/src/main/java/org/asciidoctor/diagram/ditaa/Ditaa.java @@ -16,18 +16,12 @@ import java.util.ArrayList; import java.util.Arrays; -public class Ditaa implements DiagramGenerator +public class Ditaa implements DiagramGeneratorFunction { public static final MimeType DEFAULT_OUTPUT_FORMAT = MimeType.PNG; public static final MimeType DEFAULT_CONTENT_TYPE = MimeType.TEXT_PLAIN_UTF8; public static final String DEFAULT_CHARSET = "UTF-8"; - @Override - public String getName() - { - return "ditaa"; - } - @Override public ResponseData generate(Request request) throws IOException { MimeType format = request.headers.getValue(HTTPHeader.ACCEPT); diff --git a/ditaa/src/main/java/org/asciidoctor/diagram/ditaa/DitaaDiagramGenerator.java b/ditaa/src/main/java/org/asciidoctor/diagram/ditaa/DitaaDiagramGenerator.java new file mode 100644 index 0000000..c56fd9c --- /dev/null +++ b/ditaa/src/main/java/org/asciidoctor/diagram/ditaa/DitaaDiagramGenerator.java @@ -0,0 +1,15 @@ +package org.asciidoctor.diagram.ditaa; + +import org.asciidoctor.diagram.DiagramGeneratorFunction; +import org.asciidoctor.diagram.LazyDiagramGenerator; + +public class DitaaDiagramGenerator extends LazyDiagramGenerator { + public DitaaDiagramGenerator() { + super("ditaa"); + } + + @Override + protected DiagramGeneratorFunction createGenerator() throws Exception { + return new Ditaa(); + } +} diff --git a/ditaa/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator b/ditaa/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator deleted file mode 100644 index 5572950..0000000 --- a/ditaa/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator +++ /dev/null @@ -1 +0,0 @@ -org.asciidoctor.diagram.ditaa.Ditaa \ No newline at end of file diff --git a/ditaa/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction b/ditaa/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction new file mode 100644 index 0000000..ac70be7 --- /dev/null +++ b/ditaa/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction @@ -0,0 +1 @@ +org.asciidoctor.diagram.ditaa.DitaaDiagramGenerator \ No newline at end of file diff --git a/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUML.java b/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUML.java index f005cc5..6b27af7 100644 --- a/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUML.java +++ b/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUML.java @@ -17,7 +17,7 @@ import java.util.ArrayList; import java.util.List; -public class PlantUML implements DiagramGenerator +public class PlantUML implements DiagramGeneratorFunction { public static final String X_GRAPHVIZ = "X-Graphviz"; public static final String X_PLANT_UML_CONFIG = "X-PlantUML-Config"; @@ -80,12 +80,6 @@ public class PlantUML implements DiagramGenerator } } - @Override - public String getName() - { - return "plantuml"; - } - @Override public ResponseData generate(Request request) throws IOException { File graphviz; diff --git a/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLDiagramGenerator.java b/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLDiagramGenerator.java new file mode 100644 index 0000000..d28fd65 --- /dev/null +++ b/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLDiagramGenerator.java @@ -0,0 +1,15 @@ +package org.asciidoctor.diagram.plantuml; + +import org.asciidoctor.diagram.DiagramGeneratorFunction; +import org.asciidoctor.diagram.LazyDiagramGenerator; + +public class PlantUMLDiagramGenerator extends LazyDiagramGenerator { + public PlantUMLDiagramGenerator() { + super("plantuml"); + } + + @Override + protected DiagramGeneratorFunction createGenerator() throws Exception { + return new PlantUML(); + } +} diff --git a/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLPreprocessor.java b/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLPreprocessor.java index 784d417..283a912 100644 --- a/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLPreprocessor.java +++ b/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLPreprocessor.java @@ -17,16 +17,10 @@ import java.util.List; import java.util.stream.Collectors; -public class PlantUMLPreprocessor implements DiagramGenerator +public class PlantUMLPreprocessor implements DiagramGeneratorFunction { private static final MimeType DEFAULT_OUTPUT_FORMAT = MimeType.TEXT_PLAIN_UTF8; - @Override - public String getName() - { - return "plantumlpreprocessor"; - } - @Override public ResponseData generate(Request request) throws IOException { MimeType format = request.headers.getValue(HTTPHeader.ACCEPT); diff --git a/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLPreprocessorDiagramGenerator.java b/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLPreprocessorDiagramGenerator.java new file mode 100644 index 0000000..44aca52 --- /dev/null +++ b/plantuml/src/main/java/org/asciidoctor/diagram/plantuml/PlantUMLPreprocessorDiagramGenerator.java @@ -0,0 +1,15 @@ +package org.asciidoctor.diagram.plantuml; + +import org.asciidoctor.diagram.DiagramGeneratorFunction; +import org.asciidoctor.diagram.LazyDiagramGenerator; + +public class PlantUMLPreprocessorDiagramGenerator extends LazyDiagramGenerator { + public PlantUMLPreprocessorDiagramGenerator() { + super("plantumlpreprocessor"); + } + + @Override + protected DiagramGeneratorFunction createGenerator() throws Exception { + return new PlantUMLPreprocessorDiagramGenerator(); + } +} diff --git a/plantuml/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator b/plantuml/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator deleted file mode 100644 index 01856fb..0000000 --- a/plantuml/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator +++ /dev/null @@ -1,2 +0,0 @@ -org.asciidoctor.diagram.plantuml.PlantUML -org.asciidoctor.diagram.plantuml.PlantUMLPreprocessor \ No newline at end of file diff --git a/plantuml/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction b/plantuml/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction new file mode 100644 index 0000000..5c4bf27 --- /dev/null +++ b/plantuml/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction @@ -0,0 +1,2 @@ +org.asciidoctor.diagram.plantuml.PlantUMLDiagramGenerator +org.asciidoctor.diagram.plantuml.PlantUMLPreprocessorDiagramGenerator \ No newline at end of file diff --git a/server/src/main/java/org/asciidoctor/diagram/DiagramGenerator.java b/server/src/main/java/org/asciidoctor/diagram/DiagramGenerator.java index 8be9102..8c3e562 100644 --- a/server/src/main/java/org/asciidoctor/diagram/DiagramGenerator.java +++ b/server/src/main/java/org/asciidoctor/diagram/DiagramGenerator.java @@ -1,9 +1,5 @@ package org.asciidoctor.diagram; -import java.io.IOException; - -public interface DiagramGenerator { +public interface DiagramGenerator extends DiagramGeneratorFunction { String getName(); - - ResponseData generate(Request request) throws IOException; } diff --git a/server/src/main/java/org/asciidoctor/diagram/DiagramGeneratorFunction.java b/server/src/main/java/org/asciidoctor/diagram/DiagramGeneratorFunction.java new file mode 100644 index 0000000..fe4c1e7 --- /dev/null +++ b/server/src/main/java/org/asciidoctor/diagram/DiagramGeneratorFunction.java @@ -0,0 +1,7 @@ +package org.asciidoctor.diagram; + +import java.io.IOException; + +public interface DiagramGeneratorFunction { + ResponseData generate(Request request) throws IOException; +} diff --git a/server/src/main/java/org/asciidoctor/diagram/LazyDiagramGenerator.java b/server/src/main/java/org/asciidoctor/diagram/LazyDiagramGenerator.java new file mode 100644 index 0000000..8afa87e --- /dev/null +++ b/server/src/main/java/org/asciidoctor/diagram/LazyDiagramGenerator.java @@ -0,0 +1,36 @@ +package org.asciidoctor.diagram; + +import java.io.IOException; + +public abstract class LazyDiagramGenerator implements DiagramGenerator { + private final String name; + private DiagramGeneratorFunction diagramGeneratorFunction; + private IOException loadError; + + public LazyDiagramGenerator(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + protected abstract DiagramGeneratorFunction createGenerator() throws Exception; + + public ResponseData generate(Request request) throws IOException { + if (loadError != null) { + throw loadError; + } + + if (diagramGeneratorFunction == null) { + try { + diagramGeneratorFunction = createGenerator(); + } catch (Exception e) { + loadError = new IOException(getName() + " is could not be initialised", e); + throw loadError; + } + } + + return diagramGeneratorFunction.generate(request); + } +} diff --git a/server/src/test/java/org/asciidoctor/diagram/SocketCommandServerTest.java b/server/src/test/java/org/asciidoctor/diagram/SocketCommandServerTest.java index d60a476..504900f 100644 --- a/server/src/test/java/org/asciidoctor/diagram/SocketCommandServerTest.java +++ b/server/src/test/java/org/asciidoctor/diagram/SocketCommandServerTest.java @@ -17,7 +17,7 @@ public class SocketCommandServerTest { public void testHTTPMessage() throws IOException { ServerSocket serverSocket = new ServerSocket(0); TestGenerator generator = new TestGenerator(); - Map generators = new HashMap<>(); + Map generators = new HashMap<>(); generators.put(generator.getName(), generator); final SocketCommandServer server = new SocketCommandServer(serverSocket, generators); @@ -62,7 +62,7 @@ public void run() { public void testHTTPError() throws IOException { ServerSocket serverSocket = new ServerSocket(0); TestGenerator generator = new TestGenerator(); - Map generators = new HashMap<>(); + Map generators = new HashMap<>(); generators.put(generator.getName(), generator); final SocketCommandServer server = new SocketCommandServer(serverSocket, generators); @@ -103,7 +103,7 @@ public void run() { assertEquals(MimeType.JSON_UTF8, response.headers.getValue(HTTPHeader.CONTENT_TYPE)); } - private static class TestGenerator implements DiagramGenerator + private static class TestGenerator implements DiagramGeneratorFunction { @Override public String getName() diff --git a/structurizr/src/main/java/org/asciidoctor/diagram/structurizr/Structurizr.java b/structurizr/src/main/java/org/asciidoctor/diagram/structurizr/Structurizr.java index 0b346ad..1ca3792 100644 --- a/structurizr/src/main/java/org/asciidoctor/diagram/structurizr/Structurizr.java +++ b/structurizr/src/main/java/org/asciidoctor/diagram/structurizr/Structurizr.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.stream.Stream; -public class Structurizr implements DiagramGenerator { +public class Structurizr implements DiagramGeneratorFunction { @FunctionalInterface interface ParseDsl { void parse(StructurizrDslParser parser, String dsl, File file) throws StructurizrDslParserException; @@ -93,12 +93,6 @@ static ParseDsl createParseDsl() { private static final MimeType DEFAULT_OUTPUT_FORMAT = PLANTUML; - @Override - public String getName() { - return "structurizr"; - } - - @Override public ResponseData generate(Request request) throws IOException { MimeType format = request.headers.getValue(HTTPHeader.ACCEPT); diff --git a/structurizr/src/main/java/org/asciidoctor/diagram/structurizr/StructurizrDiagramGenerator.java b/structurizr/src/main/java/org/asciidoctor/diagram/structurizr/StructurizrDiagramGenerator.java new file mode 100644 index 0000000..2e482e3 --- /dev/null +++ b/structurizr/src/main/java/org/asciidoctor/diagram/structurizr/StructurizrDiagramGenerator.java @@ -0,0 +1,15 @@ +package org.asciidoctor.diagram.structurizr; + +import org.asciidoctor.diagram.DiagramGeneratorFunction; +import org.asciidoctor.diagram.LazyDiagramGenerator; + +public class StructurizrDiagramGenerator extends LazyDiagramGenerator { + public StructurizrDiagramGenerator() { + super("structurizr"); + } + + @Override + protected DiagramGeneratorFunction createGenerator() throws Exception { + return new Structurizr(); + } +} diff --git a/structurizr/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator b/structurizr/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator deleted file mode 100644 index 3a76b75..0000000 --- a/structurizr/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator +++ /dev/null @@ -1 +0,0 @@ -org.asciidoctor.diagram.structurizr.Structurizr \ No newline at end of file diff --git a/structurizr/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction b/structurizr/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction new file mode 100644 index 0000000..9f208f7 --- /dev/null +++ b/structurizr/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction @@ -0,0 +1 @@ +org.asciidoctor.diagram.structurizr.StructurizrDiagramGenerator \ No newline at end of file diff --git a/syntrax/src/main/java/org/asciidoctor/diagram/syntrax/Syntrax.java b/syntrax/src/main/java/org/asciidoctor/diagram/syntrax/Syntrax.java index fb80cc1..e214214 100644 --- a/syntrax/src/main/java/org/asciidoctor/diagram/syntrax/Syntrax.java +++ b/syntrax/src/main/java/org/asciidoctor/diagram/syntrax/Syntrax.java @@ -13,14 +13,9 @@ import static org.atpfivt.jsyntrax.Main.generateSVG; import static org.atpfivt.jsyntrax.Main.getStyleConfig; -public class Syntrax implements DiagramGenerator { +public class Syntrax implements DiagramGeneratorFunction { public static final MimeType DEFAULT_OUTPUT_FORMAT = MimeType.SVG; - @Override - public String getName() { - return "syntrax"; - } - @Override public ResponseData generate(Request request) throws IOException { MimeType format = request.headers.getValue(HTTPHeader.ACCEPT); diff --git a/syntrax/src/main/java/org/asciidoctor/diagram/syntrax/SyntraxDiagramGenerator.java b/syntrax/src/main/java/org/asciidoctor/diagram/syntrax/SyntraxDiagramGenerator.java new file mode 100644 index 0000000..1ac2b63 --- /dev/null +++ b/syntrax/src/main/java/org/asciidoctor/diagram/syntrax/SyntraxDiagramGenerator.java @@ -0,0 +1,15 @@ +package org.asciidoctor.diagram.syntrax; + +import org.asciidoctor.diagram.DiagramGeneratorFunction; +import org.asciidoctor.diagram.LazyDiagramGenerator; + +public class SyntraxDiagramGenerator extends LazyDiagramGenerator { + public SyntraxDiagramGenerator() { + super("syntrax"); + } + + @Override + protected DiagramGeneratorFunction createGenerator() throws Exception { + return new Syntrax(); + } +} diff --git a/syntrax/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator b/syntrax/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator deleted file mode 100644 index d8245a1..0000000 --- a/syntrax/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGenerator +++ /dev/null @@ -1 +0,0 @@ -org.asciidoctor.diagram.syntrax.Syntrax \ No newline at end of file diff --git a/syntrax/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction b/syntrax/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction new file mode 100644 index 0000000..2791e98 --- /dev/null +++ b/syntrax/src/main/resources/META-INF/services/org.asciidoctor.diagram.DiagramGeneratorFunction @@ -0,0 +1 @@ +org.asciidoctor.diagram.syntrax.SyntraxDiagramGenerator \ No newline at end of file