use of io.jmix.reports.entity.Report in project jmix by jmix-framework.
the class JsonEmailTemplateDetachListener method onBeforeDetach.
@Override
public void onBeforeDetach(JsonEmailTemplate entity) {
if (entityStates.isLoaded(entity, "reportJson") && StringUtils.isNotBlank(entity.getReportJson())) {
Report reportFromXml = templateConverter.convertToReport(entity);
entity.setReport(reportFromXml);
TemplateReport templateReport = metadata.create(TemplateReport.class);
templateReport.setReport(reportFromXml);
templateReport.setEmailTemplate(entity);
templateReport.setParameterValues(new ArrayList<>());
entity.setEmailBodyReport(templateReport);
}
}
use of io.jmix.reports.entity.Report 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.Report in project jmix by jmix-framework.
the class ReportImportExportImpl method fromByteArray.
@Nullable
protected Report fromByteArray(byte[] zipBytes) throws IOException {
Report report = null;
try (ZipArchiveInputStream archiveReader = new ZipArchiveInputStream(new ByteArrayInputStream(zipBytes))) {
ZipArchiveEntry archiveEntry;
// importing report.xml to report object
while (((archiveEntry = archiveReader.getNextZipEntry()) != null) && (report == null)) {
if (isReportsStructureFile(archiveEntry.getName())) {
String xml = new String(readBytesFromEntry(archiveReader), StandardCharsets.UTF_8);
if (xml.startsWith("<")) {
// previous xml structure version
XStreamConverter xStreamConverter = new XStreamConverter();
report = xStreamConverter.convertToReport(xml);
} else {
// current json structure
report = reportsSerialization.convertToReport(xml);
}
report.setXml(xml);
}
}
}
return report;
}
use of io.jmix.reports.entity.Report 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.Report 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