Search in sources :

Example 1 with BadRequestException

use of io.kroki.server.error.BadRequestException in project kroki by yuzutech.

the class Plantuml method convert.

@Override
public void convert(String sourceDecoded, String serviceName, FileFormat fileFormat, JsonObject options, Handler<AsyncResult<Buffer>> handler) {
    String source;
    try {
        source = sanitize(sourceDecoded, this.safeMode, this.includeWhitelist);
        source = source.trim();
        source = withDelimiter(source);
    } catch (IOException e) {
        if (e instanceof UnsupportedEncodingException) {
            handler.handle(new Delegator.Failure(new BadRequestException("Characters must be encoded in UTF-8.", e)));
        } else {
            handler.handle(new Delegator.Failure(e));
        }
        return;
    }
    final String primeSource = source;
    DitaaContext ditaaContext = findDitaaContext(source);
    if (ditaaContext != null) {
        logging.reroute("plantuml", "ditaa", ditaaContext.getSource(), fileFormat);
        // found a ditaa context, delegate to the optimized ditaa service
        vertx.executeBlocking(future -> {
            try {
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                // REMIND: options are unsupported for now.
                Ditaa.convert(fileFormat, new ByteArrayInputStream(ditaaContext.getSource().getBytes()), outputStream);
                future.complete(outputStream.toByteArray());
            } catch (IllegalStateException e) {
                future.fail(e);
            }
        }, res -> handler.handle(res.map(o -> Buffer.buffer((byte[]) o))));
    } else {
        // ...otherwise, continue with PlantUML
        vertx.executeBlocking(future -> {
            try {
                byte[] data = convert(primeSource, fileFormat, options);
                future.complete(data);
            } catch (IllegalStateException e) {
                future.fail(e);
            }
        }, res -> handler.handle(res.map(o -> Buffer.buffer((byte[]) o))));
    }
}
Also used : DitaaContext(io.kroki.server.action.DitaaContext) ByteArrayInputStream(java.io.ByteArrayInputStream) UnsupportedEncodingException(java.io.UnsupportedEncodingException) BadRequestException(io.kroki.server.error.BadRequestException) IOException(java.io.IOException) ByteArrayOutputStream(java.io.ByteArrayOutputStream)

Example 2 with BadRequestException

use of io.kroki.server.error.BadRequestException in project kroki by yuzutech.

the class Structurizr method convert.

static byte[] convert(String source, FileFormat fileFormat, StructurizrPlantUMLExporter structurizrPlantUMLExporter, JsonObject options) {
    StructurizrDslParser parser = new StructurizrDslParser();
    try {
        parser.parse(source);
        Collection<View> views = parser.getWorkspace().getViews().getViews();
        if (views.isEmpty()) {
            throw new BadRequestException("Empty diagram, does not have any view.");
        }
        View selectedView;
        String viewKey = options.getString("view-key");
        if (viewKey != null && !viewKey.trim().isEmpty()) {
            Optional<View> viewFound = views.stream().filter(view -> Objects.equals(view.getKey(), viewKey)).findFirst();
            if (!viewFound.isPresent()) {
                throw new BadRequestException("Unable to find view for key: " + viewKey + ".");
            }
            selectedView = viewFound.get();
        } else {
            // take the first view if not specified
            selectedView = views.iterator().next();
        }
        final Diagram diagram;
        if (selectedView instanceof DynamicView) {
            diagram = structurizrPlantUMLExporter.export((DynamicView) selectedView);
        } else if (selectedView instanceof DeploymentView) {
            diagram = structurizrPlantUMLExporter.export((DeploymentView) selectedView);
        } else if (selectedView instanceof ComponentView) {
            diagram = structurizrPlantUMLExporter.export((ComponentView) selectedView);
        } else if (selectedView instanceof ContainerView) {
            diagram = structurizrPlantUMLExporter.export((ContainerView) selectedView);
        } else if (selectedView instanceof SystemContextView) {
            diagram = structurizrPlantUMLExporter.export((SystemContextView) selectedView);
        } else if (selectedView instanceof SystemLandscapeView) {
            diagram = structurizrPlantUMLExporter.export((SystemLandscapeView) selectedView);
        } else {
            throw new BadRequestException("View type is not supported: " + selectedView.getClass().getSimpleName() + ", must be a DynamicView, DeploymentView, ComponentView, ContainerView, SystemContextView or SystemLandscapeView.");
        }
        return Plantuml.convert(diagram.getDefinition(), fileFormat, new JsonObject());
    } catch (StructurizrDslParserException e) {
        String cause = e.getMessage();
        final String message;
        if (cause != null && !cause.trim().isEmpty()) {
            message = "Unable to parse the Structurizr DSL. " + cause + ".";
        } else {
            message = "Unable to parse the Structurizr DSL.";
        }
        throw new BadRequestException(message, e);
    }
}
Also used : Arrays(java.util.Arrays) DecodeException(io.kroki.server.error.DecodeException) DiagramSource(io.kroki.server.decode.DiagramSource) StructurizrDslParserException(com.structurizr.dsl.StructurizrDslParserException) View(com.structurizr.view.View) SystemLandscapeView(com.structurizr.view.SystemLandscapeView) JsonObject(io.vertx.core.json.JsonObject) AsyncResult(io.vertx.core.AsyncResult) DeploymentView(com.structurizr.view.DeploymentView) Diagram(com.structurizr.export.Diagram) BadRequestException(io.kroki.server.error.BadRequestException) ComponentView(com.structurizr.view.ComponentView) ContainerView(com.structurizr.view.ContainerView) DynamicView(com.structurizr.view.DynamicView) Collection(java.util.Collection) StructurizrPlantUMLExporter(com.structurizr.export.plantuml.StructurizrPlantUMLExporter) Vertx(io.vertx.core.Vertx) FileFormat(io.kroki.server.format.FileFormat) SourceDecoder(io.kroki.server.decode.SourceDecoder) Objects(java.util.Objects) List(java.util.List) Buffer(io.vertx.core.buffer.Buffer) StructurizrDslParser(com.structurizr.dsl.StructurizrDslParser) SystemContextView(com.structurizr.view.SystemContextView) Optional(java.util.Optional) Handler(io.vertx.core.Handler) StructurizrDslParser(com.structurizr.dsl.StructurizrDslParser) JsonObject(io.vertx.core.json.JsonObject) StructurizrDslParserException(com.structurizr.dsl.StructurizrDslParserException) View(com.structurizr.view.View) SystemLandscapeView(com.structurizr.view.SystemLandscapeView) DeploymentView(com.structurizr.view.DeploymentView) ComponentView(com.structurizr.view.ComponentView) ContainerView(com.structurizr.view.ContainerView) DynamicView(com.structurizr.view.DynamicView) SystemContextView(com.structurizr.view.SystemContextView) Diagram(com.structurizr.export.Diagram) ComponentView(com.structurizr.view.ComponentView) SystemContextView(com.structurizr.view.SystemContextView) BadRequestException(io.kroki.server.error.BadRequestException) SystemLandscapeView(com.structurizr.view.SystemLandscapeView) DynamicView(com.structurizr.view.DynamicView) ContainerView(com.structurizr.view.ContainerView) DeploymentView(com.structurizr.view.DeploymentView)

Example 3 with BadRequestException

use of io.kroki.server.error.BadRequestException in project kroki by yuzutech.

the class Plantuml method convert.

static byte[] convert(String source, FileFormat format, JsonObject options) {
    try {
        String theme = options.getString("theme");
        if (theme != null && !theme.trim().isEmpty()) {
            // add !theme directive just after the @start directive
            source = START_BLOCK_RX.matcher(source).replaceAll("$1!theme " + theme + "\n");
        }
        SourceStringReader reader = new SourceStringReader(source);
        if (format == FileFormat.BASE64) {
            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
            reader.outputImage(baos, 0, new FileFormatOption(FileFormat.PNG.toPlantumlFileFormat()));
            baos.close();
            final String encodedBytes = "data:image/png;base64," + Base64Coder.encodeLines(baos.toByteArray()).replaceAll("\\s", "");
            return encodedBytes.getBytes();
        }
        if (reader.getBlocks().isEmpty()) {
            throw new BadRequestException("Empty diagram, missing delimiters?");
        }
        final BlockUml blockUml = reader.getBlocks().get(0);
        final Diagram diagram = blockUml.getDiagram();
        if (diagram instanceof PSystemError) {
            Collection<ErrorUml> errors = ((PSystemError) diagram).getErrorsUml();
            if (!errors.isEmpty()) {
                ErrorUml errorUml = errors.iterator().next();
                LineLocation lineLocation = errorUml.getLineLocation();
                String lineLocationPosition = "";
                if (lineLocation != null) {
                    lineLocationPosition = " (line: " + lineLocation.getPosition() + ")";
                }
                throw new BadRequestException(errorUml.getError() + lineLocationPosition);
            }
            throw new BadRequestException("Unable to convert the diagram");
        }
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        diagram.exportDiagram(byteArrayOutputStream, 0, new FileFormatOption(format.toPlantumlFileFormat()));
        return byteArrayOutputStream.toByteArray();
    } catch (IOException e) {
        throw new RuntimeException("Bad request", e);
    }
}
Also used : FileFormatOption(net.sourceforge.plantuml.FileFormatOption) ByteArrayOutputStream(java.io.ByteArrayOutputStream) LineLocation(net.sourceforge.plantuml.LineLocation) IOException(java.io.IOException) Diagram(net.sourceforge.plantuml.core.Diagram) PSystemError(net.sourceforge.plantuml.error.PSystemError) SourceStringReader(net.sourceforge.plantuml.SourceStringReader) BadRequestException(io.kroki.server.error.BadRequestException) BlockUml(net.sourceforge.plantuml.BlockUml) ErrorUml(net.sourceforge.plantuml.ErrorUml)

Aggregations

BadRequestException (io.kroki.server.error.BadRequestException)3 ByteArrayOutputStream (java.io.ByteArrayOutputStream)2 IOException (java.io.IOException)2 StructurizrDslParser (com.structurizr.dsl.StructurizrDslParser)1 StructurizrDslParserException (com.structurizr.dsl.StructurizrDslParserException)1 Diagram (com.structurizr.export.Diagram)1 StructurizrPlantUMLExporter (com.structurizr.export.plantuml.StructurizrPlantUMLExporter)1 ComponentView (com.structurizr.view.ComponentView)1 ContainerView (com.structurizr.view.ContainerView)1 DeploymentView (com.structurizr.view.DeploymentView)1 DynamicView (com.structurizr.view.DynamicView)1 SystemContextView (com.structurizr.view.SystemContextView)1 SystemLandscapeView (com.structurizr.view.SystemLandscapeView)1 View (com.structurizr.view.View)1 DitaaContext (io.kroki.server.action.DitaaContext)1 DiagramSource (io.kroki.server.decode.DiagramSource)1 SourceDecoder (io.kroki.server.decode.SourceDecoder)1 DecodeException (io.kroki.server.error.DecodeException)1 FileFormat (io.kroki.server.format.FileFormat)1 AsyncResult (io.vertx.core.AsyncResult)1