use of io.jmix.reports.entity.ReportTemplate 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[]
}
use of io.jmix.reports.entity.ReportTemplate in project jmix by jmix-framework.
the class ReportImportExportImpl method exportReport.
/**
* Exports single report to ZIP archive with name {@code <report name>.zip}.
* There are 2 files in archive: report.structure and a template file (odt, xls or other..)
*
* @param report Report object that must be exported.
* @return ZIP archive as a byte array.
* @throws IOException if any I/O error occurs
*/
protected byte[] exportReport(Report report) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ZipArchiveOutputStream zipOutputStream = new ZipArchiveOutputStream(byteArrayOutputStream);
zipOutputStream.setMethod(ZipArchiveOutputStream.STORED);
zipOutputStream.setEncoding(ENCODING);
report = reloadReport(report);
if (report != null) {
String xml = report.getXml();
byte[] xmlBytes = xml.getBytes(StandardCharsets.UTF_8);
ArchiveEntry zipEntryReportObject = newStoredEntry("report.structure", xmlBytes);
zipOutputStream.putArchiveEntry(zipEntryReportObject);
zipOutputStream.write(xmlBytes);
Report xmlReport = reportsSerialization.convertToReport(xml);
if (report.getTemplates() != null && xmlReport.getTemplates() != null) {
for (int i = 0; i < report.getTemplates().size(); i++) {
ReportTemplate xmlTemplate = xmlReport.getTemplates().get(i);
ReportTemplate template = null;
for (ReportTemplate it : report.getTemplates()) {
if (xmlTemplate.equals(it)) {
template = it;
break;
}
}
if (template != null && template.getContent() != null) {
byte[] fileBytes = template.getContent();
ArchiveEntry zipEntryTemplate = newStoredEntry("templates/" + i + "/" + template.getName(), fileBytes);
zipOutputStream.putArchiveEntry(zipEntryTemplate);
zipOutputStream.write(fileBytes);
}
}
}
}
zipOutputStream.closeArchiveEntry();
zipOutputStream.close();
return byteArrayOutputStream.toByteArray();
}
use of io.jmix.reports.entity.ReportTemplate in project jmix by jmix-framework.
the class ReportImportExportImpl method updateReportTemplate.
protected void updateReportTemplate(Report report, byte[] zipBytes) throws IOException {
try (ZipArchiveInputStream archiveReader = new ZipArchiveInputStream(new ByteArrayInputStream(zipBytes))) {
ZipArchiveEntry archiveEntry;
if (report.getTemplates() != null) {
// unpack templates
int i = 0;
while ((archiveEntry = archiveReader.getNextZipEntry()) != null && (i < report.getTemplates().size())) {
if (!isReportsStructureFile(archiveEntry.getName()) && !archiveEntry.isDirectory()) {
String[] namePaths = archiveEntry.getName().split("/");
int index = Integer.parseInt(namePaths[1]);
if (index >= 0) {
ReportTemplate template = report.getTemplates().get(index);
template.setContent(readBytesFromEntry(archiveReader));
if (StringUtils.isBlank(template.getName())) {
template.setName(namePaths[2]);
}
}
i++;
}
}
}
}
}
use of io.jmix.reports.entity.ReportTemplate in project jmix by jmix-framework.
the class FluentReportRunner method buildContext.
/**
* Creates an instance of {@link ReportRunContext} based on the parameters specified for the runner.
*
* @return run context
*/
public ReportRunContext buildContext() {
Report report = getReportToUse();
ReportTemplate reportTemplate = getReportTemplateToUse(report);
return new ReportRunContext(report).setReportTemplate(reportTemplate).setOutputNamePattern(this.outputNamePattern).setOutputType(this.outputType).setParams(this.params);
}
use of io.jmix.reports.entity.ReportTemplate 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();
}
}
}
Aggregations