Search in sources :

Example 1 with ReportRunContext

use of io.jmix.reports.runner.ReportRunContext in project jmix-docs by Haulmont.

the class RunReportScreen method onRrcBtn1Click.

@Subscribe("rrcBtn1")
protected void onRrcBtn1Click(Button.ClickEvent event) {
    Report report = getReportByCode("BOOKS");
    LiteratureType type = dataManager.load(LiteratureType.class).query("select c from jmxrpr_LiteratureType c where c.name = :name").parameter("name", "Art").one();
    // tag::report-run-context-v1[]
    ReportRunContext context = new ReportRunContext(report).addParam("type", type).setOutputNamePattern("Books");
    // end::report-run-context-v1[]
    ReportOutputDocument document = reportRunner.run(context);
    List<ReportOutputDocument> documents = new ArrayList<>();
    documents.add(document);
    // tag::report-zip-utils[]
    byte[] zipArchiveContent = reportZipUtils.createZipArchive(documents);
    downloader.download(zipArchiveContent, "Reports.zip", DownloadFormat.ZIP);
// end::report-zip-utils[]
}
Also used : UiReportRunContext(io.jmix.reportsui.runner.UiReportRunContext) ReportRunContext(io.jmix.reports.runner.ReportRunContext) ReportOutputDocument(com.haulmont.yarg.reporting.ReportOutputDocument) Report(io.jmix.reports.entity.Report) ArrayList(java.util.ArrayList) LiteratureType(reports.ex2.entity.LiteratureType) Subscribe(io.jmix.ui.screen.Subscribe)

Example 2 with ReportRunContext

use of io.jmix.reports.runner.ReportRunContext in project jmix-docs by Haulmont.

the class RunReportScreen method onRrcBtn2Click.

// tag::rrc-btn2-start[]
@Subscribe("rrcBtn2")
protected void onRrcBtn2Click(Button.ClickEvent event) {
    // end::rrc-btn2-start[]
    Report report = getReportByCode("BOOKS");
    LiteratureType type = dataManager.load(LiteratureType.class).query("select c from jmxrpr_LiteratureType c where c.name = :name").parameter("name", "Art").one();
    Map<String, Object> paramsMap = new HashMap<>();
    paramsMap.put("type", type);
    ReportTemplate template = dataManager.load(ReportTemplate.class).query("select c from report_ReportTemplate c where c.code = :code and c.report = :report").parameter("code", "DEFAULT").parameter("report", report).one();
    // tag::report-run-context-v2[]
    ReportRunContext context = new ReportRunContext(report).setReportTemplate(template).setOutputType(ReportOutputType.PDF).setParams(paramsMap);
    // end::report-run-context-v2[]
    // tag::report-runner-v1[]
    ReportOutputDocument document = reportRunner.run(// <1>
    new ReportRunContext(report).setParams(paramsMap));
// end::report-runner-v1[]
// ReportOutputDocument document = reportRunner.run(context);
// tag::rrc-btn2-end[]
}
Also used : UiReportRunContext(io.jmix.reportsui.runner.UiReportRunContext) ReportRunContext(io.jmix.reports.runner.ReportRunContext) ReportOutputDocument(com.haulmont.yarg.reporting.ReportOutputDocument) Report(io.jmix.reports.entity.Report) HashMap(java.util.HashMap) ReportTemplate(io.jmix.reports.entity.ReportTemplate) LiteratureType(reports.ex2.entity.LiteratureType) Subscribe(io.jmix.ui.screen.Subscribe)

Example 3 with ReportRunContext

use of io.jmix.reports.runner.ReportRunContext in project jmix by jmix-framework.

the class EmailTemplatesImpl method createEmailAttachment.

protected EmailAttachment createEmailAttachment(String templateName, ReportWithParams reportWithParams) {
    ReportOutputDocument outputDocument = reportRunner.run(new ReportRunContext(reportWithParams.getReport()).setParams(reportWithParams.getParams()));
    String fileName = outputDocument.getDocumentName();
    if (StringUtils.isNotBlank(templateName)) {
        String extension = Files.getFileExtension(templateName);
        String docExtension = Files.getFileExtension(fileName);
        if (StringUtils.isNotBlank(extension)) {
            fileName = templateName;
        } else if (StringUtils.isNotBlank(docExtension)) {
            fileName = templateName + "." + docExtension;
        } else {
            fileName = templateName;
        }
    }
    return new EmailAttachment(outputDocument.getContent(), fileName);
}
Also used : ReportOutputDocument(com.haulmont.yarg.reporting.ReportOutputDocument) ReportRunContext(io.jmix.reports.runner.ReportRunContext) EmailAttachment(io.jmix.email.EmailAttachment)

Example 4 with ReportRunContext

use of io.jmix.reports.runner.ReportRunContext in project jmix by jmix-framework.

the class ReportRunnerImpl method createReportDocumentInternal.

protected ReportOutputDocument createReportDocumentInternal(ReportRunContext context) {
    Report report = context.getReport();
    ReportTemplate template = context.getReportTemplate();
    ReportOutputType outputType = context.getOutputType();
    Map<String, Object> params = context.getParams();
    String outputNamePattern = context.getOutputNamePattern();
    StopWatch stopWatch = null;
    MDC.put("user", SecurityContextHolder.getContext().getAuthentication().getName());
    // executions.startExecution(report.getId().toString(), "Reporting");
    try {
        // TODO Slf4JStopWatch
        // stopWatch = new Slf4JStopWatch("Reporting#" + report.getName());
        Map<String, Object> resultParams = new HashMap<>(params);
        params.entrySet().stream().filter(param -> param.getValue() instanceof ParameterPrototype).forEach(param -> {
            ParameterPrototype prototype = (ParameterPrototype) param.getValue();
            List data = prototypesLoader.loadData(prototype);
            resultParams.put(param.getKey(), data);
        });
        if (template.isCustom()) {
            CustomFormatter customFormatter = applicationContext.getBean(CustomFormatter.class, report, template);
            template.setCustomReport(customFormatter);
        }
        com.haulmont.yarg.structure.ReportOutputType resultOutputType = (outputType != null) ? outputType.getOutputType() : template.getOutputType();
        return reportingAPI.runReport(new RunParams(report).template(template).params(resultParams).output(resultOutputType).outputNamePattern(outputNamePattern));
    } catch (NoFreePortsException nfe) {
        throw new NoOpenOfficeFreePortsException(nfe.getMessage());
    } catch (OpenOfficeException ooe) {
        throw new FailedToConnectToOpenOfficeException(ooe.getMessage());
    } catch (com.haulmont.yarg.exception.UnsupportedFormatException fe) {
        throw new UnsupportedFormatException(fe.getMessage());
    } catch (com.haulmont.yarg.exception.ValidationException ve) {
        throw new ValidationException(ve.getMessage());
    } catch (ReportingInterruptedException ie) {
        throw new ReportCanceledException(String.format("Report is canceled. %s", ie.getMessage()));
    } catch (com.haulmont.yarg.exception.ReportingException re) {
        // todo https://github.com/Haulmont/jmix-reports/issues/22
        // Throwable rootCause = ExceptionUtils.getRootCause(re);
        // if (rootCause instanceof ResourceCanceledException) {
        // throw new ReportCanceledException(String.format("Report is canceled. %s", rootCause.getMessage()));
        // }
        // noinspection unchecked
        List<Throwable> list = ExceptionUtils.getThrowableList(re);
        StringBuilder sb = new StringBuilder();
        for (Iterator<Throwable> it = list.iterator(); it.hasNext(); ) {
            // noinspection ThrowableResultOfMethodCallIgnored
            sb.append(it.next().getMessage());
            if (it.hasNext())
                sb.append("\n");
        }
        throw new ReportingException(sb.toString());
    } finally {
        // todo https://github.com/Haulmont/jmix-reports/issues/22
        // executions.endExecution();
        MDC.remove("user");
        MDC.remove("webContextName");
        if (stopWatch != null) {
            stopWatch.stop();
        }
    }
}
Also used : ReportingInterruptedException(com.haulmont.yarg.exception.ReportingInterruptedException) Id(io.jmix.core.Id) Autowired(org.springframework.beans.factory.annotation.Autowired) HashMap(java.util.HashMap) PrototypesLoader(io.jmix.reports.PrototypesLoader) ObjectProvider(org.springframework.beans.factory.ObjectProvider) FluentReportRunner(io.jmix.reports.runner.FluentReportRunner) ReportRunner(io.jmix.reports.runner.ReportRunner) ReportsUtils(io.jmix.reports.util.ReportsUtils) ReportsProperties(io.jmix.reports.ReportsProperties) ParameterPrototype(io.jmix.reports.app.ParameterPrototype) Map(java.util.Map) SecurityContextHolder(org.springframework.security.core.context.SecurityContextHolder) NoFreePortsException(com.haulmont.yarg.formatters.impl.doc.connector.NoFreePortsException) ReportExecutionHistoryRecorder(io.jmix.reports.ReportExecutionHistoryRecorder) DataManager(io.jmix.core.DataManager) ReportTemplate(io.jmix.reports.entity.ReportTemplate) Iterator(java.util.Iterator) ReportExecution(io.jmix.reports.entity.ReportExecution) io.jmix.reports.exception(io.jmix.reports.exception) ReportOutputType(io.jmix.reports.entity.ReportOutputType) StopWatch(org.apache.commons.lang3.time.StopWatch) ReportRunContext(io.jmix.reports.runner.ReportRunContext) ApplicationContext(org.springframework.context.ApplicationContext) Component(org.springframework.stereotype.Component) List(java.util.List) RunParams(com.haulmont.yarg.reporting.RunParams) MDC(org.slf4j.MDC) EntityStates(io.jmix.core.EntityStates) ReportOutputDocument(com.haulmont.yarg.reporting.ReportOutputDocument) ReportingAPI(com.haulmont.yarg.reporting.ReportingAPI) CustomFormatter(io.jmix.reports.libintegration.CustomFormatter) Report(io.jmix.reports.entity.Report) OpenOfficeException(com.haulmont.yarg.exception.OpenOfficeException) ExceptionUtils(org.apache.commons.lang3.exception.ExceptionUtils) io.jmix.reports.exception(io.jmix.reports.exception) ParameterPrototype(io.jmix.reports.app.ParameterPrototype) OpenOfficeException(com.haulmont.yarg.exception.OpenOfficeException) RunParams(com.haulmont.yarg.reporting.RunParams) HashMap(java.util.HashMap) ReportTemplate(io.jmix.reports.entity.ReportTemplate) ReportingInterruptedException(com.haulmont.yarg.exception.ReportingInterruptedException) ReportOutputType(io.jmix.reports.entity.ReportOutputType) Iterator(java.util.Iterator) List(java.util.List) NoFreePortsException(com.haulmont.yarg.formatters.impl.doc.connector.NoFreePortsException) Report(io.jmix.reports.entity.Report) StopWatch(org.apache.commons.lang3.time.StopWatch) CustomFormatter(io.jmix.reports.libintegration.CustomFormatter)

Example 5 with ReportRunContext

use of io.jmix.reports.runner.ReportRunContext in project jmix by jmix-framework.

the class ReportRestControllerManager method runReport.

public ReportRestResult runReport(String entityId, String bodyJson) {
    Report report = loadReportInternal(entityId);
    final ReportRunRestBody body;
    try {
        body = createGson().fromJson(bodyJson, ReportRunRestBody.class);
    } catch (JsonSyntaxException e) {
        throw new RestAPIException("Invalid JSON body", e.getMessage(), HttpStatus.BAD_REQUEST, e);
    }
    if (body.template != null) {
        ReportTemplate reportTemplate = report.getTemplates().stream().filter(t -> Objects.equals(t.getCode(), body.template)).findFirst().orElseThrow(() -> new RestAPIException("Template not found", String.format("Template with code %s not found for report %s", body.template, entityId), HttpStatus.BAD_REQUEST));
        checkReportOutputType(reportTemplate);
    } else {
        checkReportOutputType(report.getDefaultTemplate());
    }
    Map<String, Object> preparedValues = prepareValues(report, body.parameters);
    if (body.template != null) {
        try {
            ReportOutputDocument document = reportRunner.byReportEntity(report).withTemplateCode(body.template).withParams(preparedValues).run();
            return new ReportRestResult(document, body.attachment);
        } catch (FailedToConnectToOpenOfficeException e) {
            throw new RestAPIException("Run report error", "Couldn't find LibreOffice instance", HttpStatus.INTERNAL_SERVER_ERROR);
        } catch (NoOpenOfficeFreePortsException e) {
            throw new RestAPIException("Run report error", "Couldn't connect to LibreOffice instance. No free ports available.", HttpStatus.INTERNAL_SERVER_ERROR);
        } catch (ReportingException e) {
            throw new RestAPIException("Run report error", e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    } else {
        try {
            return new ReportRestResult(reportRunner.run(new ReportRunContext(report).setParams(preparedValues)), body.attachment);
        } catch (FailedToConnectToOpenOfficeException e) {
            throw new RestAPIException("Run report error", "Couldn't find LibreOffice instance", HttpStatus.INTERNAL_SERVER_ERROR);
        } catch (NoOpenOfficeFreePortsException e) {
            throw new RestAPIException("Run report error", "Couldn't connect to LibreOffice instance. No free ports available.", HttpStatus.INTERNAL_SERVER_ERROR);
        } catch (ReportingException e) {
            throw new RestAPIException("Run report error", e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}
Also used : ReportOutputDocument(com.haulmont.yarg.reporting.ReportOutputDocument) ReportingException(io.jmix.reports.exception.ReportingException) ReportRunContext(io.jmix.reports.runner.ReportRunContext) JsonSyntaxException(com.google.gson.JsonSyntaxException) NoOpenOfficeFreePortsException(io.jmix.reports.exception.NoOpenOfficeFreePortsException) FailedToConnectToOpenOfficeException(io.jmix.reports.exception.FailedToConnectToOpenOfficeException)

Aggregations

ReportOutputDocument (com.haulmont.yarg.reporting.ReportOutputDocument)7 ReportRunContext (io.jmix.reports.runner.ReportRunContext)7 Report (io.jmix.reports.entity.Report)3 ReportTemplate (io.jmix.reports.entity.ReportTemplate)2 UiReportRunContext (io.jmix.reportsui.runner.UiReportRunContext)2 Subscribe (io.jmix.ui.screen.Subscribe)2 HashMap (java.util.HashMap)2 LiteratureType (reports.ex2.entity.LiteratureType)2 JsonSyntaxException (com.google.gson.JsonSyntaxException)1 OpenOfficeException (com.haulmont.yarg.exception.OpenOfficeException)1 ReportingInterruptedException (com.haulmont.yarg.exception.ReportingInterruptedException)1 NoFreePortsException (com.haulmont.yarg.formatters.impl.doc.connector.NoFreePortsException)1 ReportingAPI (com.haulmont.yarg.reporting.ReportingAPI)1 RunParams (com.haulmont.yarg.reporting.RunParams)1 DataManager (io.jmix.core.DataManager)1 EntityStates (io.jmix.core.EntityStates)1 Id (io.jmix.core.Id)1 EmailAttachment (io.jmix.email.EmailAttachment)1 PrototypesLoader (io.jmix.reports.PrototypesLoader)1 ReportExecutionHistoryRecorder (io.jmix.reports.ReportExecutionHistoryRecorder)1