BAEL-20877 Move Spring Boot MVC Birt

This commit is contained in:
mikr
2020-01-26 17:06:40 +01:00
parent 046abde989
commit f84f4a6957
14 changed files with 5 additions and 3 deletions

View File

@@ -0,0 +1,93 @@
package com.baeldung.birt.designer;
import com.ibm.icu.util.ULocale;
import org.apache.log4j.Logger;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.report.model.api.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import java.io.File;
import java.io.IOException;
@SpringBootApplication
public class ReportDesignApplication implements CommandLineRunner {
private static final Logger log = Logger.getLogger(ReportDesignApplication.class);
@Value("${reports.relative.path}")
private String REPORTS_FOLDER;
public static void main(String[] args) {
new SpringApplicationBuilder(ReportDesignApplication.class).web(WebApplicationType.NONE).build().run(args);
}
@Override public void run(String... args) throws Exception {
buildReport();
}
private void buildReport() throws IOException, BirtException {
final DesignConfig config = new DesignConfig();
final IDesignEngine engine;
try {
Platform.startup(config);
IDesignEngineFactory factory = (IDesignEngineFactory) Platform
.createFactoryObject(IDesignEngineFactory.EXTENSION_DESIGN_ENGINE_FACTORY);
engine = factory.createDesignEngine(config);
} catch (Exception ex) {
log.error("Exception during creation of DesignEngine", ex);
throw ex;
}
SessionHandle session = engine.newSessionHandle(ULocale.ENGLISH);
ReportDesignHandle design = session.createDesign();
design.setTitle("Sample Report");
// The element factory creates instances of the various BIRT elements.
ElementFactory factory = design.getElementFactory();
// Create a simple master page that describes how the report will
// appear when printed.
//
// Note: The report will fail to load in the BIRT designer
// unless you create a master page.
DesignElementHandle element = factory.newSimpleMasterPage("Page Master"); //$NON-NLS-1$
design.getMasterPages().add(element);
// Create a grid
GridHandle grid = factory.newGridItem(null, 2 /* cols */, 1 /* row */);
design.getBody().add(grid);
grid.setWidth("100%");
RowHandle row0 = (RowHandle) grid.getRows().get(0);
// Create an image and add it to the first cell.
ImageHandle image = factory.newImage(null);
CellHandle cell = (CellHandle) row0.getCells().get(0);
cell.getContent().add(image);
image.setURL("\"https://www.baeldung.com/wp-content/themes/baeldung/favicon/favicon-96x96.png\"");
// Create a label and add it to the second cell.
LabelHandle label = factory.newLabel(null);
cell = (CellHandle) row0.getCells().get(1);
cell.getContent().add(label);
label.setText("Hello, Baeldung world!");
// Save the design and close it.
File report = new File(REPORTS_FOLDER);
report.mkdirs();
design.saveAs(new File(report, "static_report.rptdesign").getAbsolutePath());
design.close();
log.info("Report generated");
}
}

View File

@@ -0,0 +1,29 @@
package com.baeldung.birt.engine;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication
@EnableWebMvc
public class ReportEngineApplication implements WebMvcConfigurer {
@Value("${reports.relative.path}")
private String reportsPath;
@Value("${images.relative.path}")
private String imagesPath;
public static void main(final String[] args) {
SpringApplication.run(ReportEngineApplication.class, args);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler(reportsPath + imagesPath + "/**")
.addResourceLocations("file:///" + System.getProperty("user.dir") + "/" + reportsPath + imagesPath);
}
}

View File

@@ -0,0 +1,51 @@
package com.baeldung.birt.engine.controller;
import com.baeldung.birt.engine.dto.OutputType;
import com.baeldung.birt.engine.dto.Report;
import com.baeldung.birt.engine.service.BirtReportService;
import org.apache.log4j.Logger;
import org.eclipse.birt.report.engine.api.EngineException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@Controller
public class BirtReportController {
private static final Logger log = Logger.getLogger(BirtReportController.class);
@Autowired
private BirtReportService reportService;
@RequestMapping(produces = "application/json", method = RequestMethod.GET, value = "/report")
@ResponseBody
public List<Report> listReports() {
return reportService.getReports();
}
@RequestMapping(produces = "application/json", method = RequestMethod.GET, value = "/report/reload")
@ResponseBody
public ResponseEntity reloadReports(HttpServletResponse response) {
try {
log.info("Reloading reports");
reportService.loadReports();
} catch (EngineException e) {
log.error("There was an error reloading the reports in memory: ", e);
return ResponseEntity.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).build();
}
return ResponseEntity.ok().build();
}
@RequestMapping(method = RequestMethod.GET, value = "/report/{name}")
@ResponseBody
public void generateFullReport(HttpServletResponse response, HttpServletRequest request,
@PathVariable("name") String name, @RequestParam("output") String output) {
log.info("Generating full report: " + name + "; format: " + output);
OutputType format = OutputType.from(output);
reportService.generateMainReport(name, format, response, request);
}
}

View File

@@ -0,0 +1,21 @@
package com.baeldung.birt.engine.dto;
import org.eclipse.birt.report.engine.api.IRenderOption;
public enum OutputType {
HTML(IRenderOption.OUTPUT_FORMAT_HTML),
PDF(IRenderOption.OUTPUT_FORMAT_PDF),
INVALID("invalid");
String val;
OutputType(String val) {
this.val = val;
}
public static OutputType from(String text) {
for (OutputType output : values()) {
if(output.val.equalsIgnoreCase(text)) return output;
}
return INVALID;
}
}

View File

@@ -0,0 +1,37 @@
package com.baeldung.birt.engine.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* Report DTO class
*/
@Data
@NoArgsConstructor
public class Report {
private String title;
private String name;
private List<Parameter> parameters;
public Report(String title, String name) {
this.title = title;
this.name = name;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Parameter {
private String title;
private String name;
private ParameterType type;
}
public enum ParameterType {
INT, STRING
}
}

View File

@@ -0,0 +1,168 @@
package com.baeldung.birt.engine.service;
import com.baeldung.birt.engine.dto.OutputType;
import com.baeldung.birt.engine.dto.Report;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.report.engine.api.*;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.*;
@Service
public class BirtReportService implements ApplicationContextAware, DisposableBean {
@Value("${reports.relative.path}")
private String reportsPath;
@Value("${images.relative.path}")
private String imagesPath;
private HTMLServerImageHandler htmlImageHandler = new HTMLServerImageHandler();
@Autowired
private ResourceLoader resourceLoader;
@Autowired
private ServletContext servletContext;
private IReportEngine birtEngine;
private ApplicationContext context;
private String imageFolder;
private Map<String, IReportRunnable> reports = new HashMap<>();
@SuppressWarnings("unchecked")
@PostConstruct
protected void initialize() throws BirtException {
EngineConfig config = new EngineConfig();
config.getAppContext().put("spring", this.context);
Platform.startup(config);
IReportEngineFactory factory = (IReportEngineFactory) Platform
.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
birtEngine = factory.createReportEngine(config);
imageFolder = System.getProperty("user.dir") + File.separatorChar + reportsPath + imagesPath;
loadReports();
}
@Override
public void setApplicationContext(ApplicationContext context) {
this.context = context;
}
/**
* Load report files to memory
*
*/
public void loadReports() throws EngineException {
File folder = new File(reportsPath);
for (String file : Objects.requireNonNull(folder.list())) {
if (!file.endsWith(".rptdesign")) {
continue;
}
reports.put(file.replace(".rptdesign", ""),
birtEngine.openReportDesign(folder.getAbsolutePath() + File.separator + file));
}
}
public List<Report> getReports() {
List<Report> response = new ArrayList<>();
for (Map.Entry<String, IReportRunnable> entry : reports.entrySet()) {
IReportRunnable report = reports.get(entry.getKey());
IGetParameterDefinitionTask task = birtEngine.createGetParameterDefinitionTask(report);
Report reportItem = new Report(report.getDesignHandle().getProperty("title").toString(), entry.getKey());
for (Object h : task.getParameterDefns(false)) {
IParameterDefn def = (IParameterDefn) h;
reportItem.getParameters()
.add(new Report.Parameter(def.getPromptText(), def.getName(), getParameterType(def)));
}
response.add(reportItem);
}
return response;
}
private Report.ParameterType getParameterType(IParameterDefn param) {
if (IParameterDefn.TYPE_INTEGER == param.getDataType()) {
return Report.ParameterType.INT;
}
return Report.ParameterType.STRING;
}
public void generateMainReport(String reportName, OutputType output, HttpServletResponse response, HttpServletRequest request) {
switch (output) {
case HTML:
generateHTMLReport(reports.get(reportName), response, request);
break;
case PDF:
generatePDFReport(reports.get(reportName), response, request);
break;
default:
throw new IllegalArgumentException("Output type not recognized:" + output);
}
}
/**
* Generate a report as HTML
*/
@SuppressWarnings("unchecked")
private void generateHTMLReport(IReportRunnable report, HttpServletResponse response, HttpServletRequest request) {
IRunAndRenderTask runAndRenderTask = birtEngine.createRunAndRenderTask(report);
response.setContentType(birtEngine.getMIMEType("html"));
IRenderOption options = new RenderOption();
HTMLRenderOption htmlOptions = new HTMLRenderOption(options);
htmlOptions.setOutputFormat("html");
htmlOptions.setBaseImageURL("/" + reportsPath + imagesPath);
htmlOptions.setImageDirectory(imageFolder);
htmlOptions.setImageHandler(htmlImageHandler);
runAndRenderTask.setRenderOption(htmlOptions);
runAndRenderTask.getAppContext().put(EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, request);
try {
htmlOptions.setOutputStream(response.getOutputStream());
runAndRenderTask.run();
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
runAndRenderTask.close();
}
}
/**
* Generate a report as PDF
*/
@SuppressWarnings("unchecked")
private void generatePDFReport(IReportRunnable report, HttpServletResponse response, HttpServletRequest request) {
IRunAndRenderTask runAndRenderTask = birtEngine.createRunAndRenderTask(report);
response.setContentType(birtEngine.getMIMEType("pdf"));
IRenderOption options = new RenderOption();
PDFRenderOption pdfRenderOption = new PDFRenderOption(options);
pdfRenderOption.setOutputFormat("pdf");
runAndRenderTask.setRenderOption(pdfRenderOption);
runAndRenderTask.getAppContext().put(EngineConstants.APPCONTEXT_PDF_RENDER_CONTEXT, request);
try {
pdfRenderOption.setOutputStream(response.getOutputStream());
runAndRenderTask.run();
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
runAndRenderTask.close();
}
}
@Override
public void destroy() {
birtEngine.destroy();
Platform.shutdown();
}
}

View File

@@ -0,0 +1,2 @@
reports.relative.path=reports/
images.relative.path=images/