ronaldkwandy

Untitled

Aug 30th, 2019
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.00 KB | None | 0 0
  1. package id.co.sofcograha.gajiidapi.base.report;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.util.Base64;
  7. import java.util.Date;
  8. import java.util.List;
  9. import java.util.Map;
  10.  
  11. import javax.servlet.http.HttpServletResponse;
  12.  
  13. import org.apache.commons.logging.Log;
  14. import org.apache.commons.logging.LogFactory;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.http.HttpStatus;
  17. import org.springframework.http.ResponseEntity;
  18. import org.springframework.stereotype.Component;
  19. import org.springframework.web.context.annotation.RequestScope;
  20.  
  21. import com.lowagie.text.pdf.PdfWriter;
  22.  
  23. import id.co.sofcograha.gajiidapi.base.authentication.CurrentUser;
  24. import id.co.sofcograha.gajiidapi.base.extendables.FreeFormService;
  25. import id.co.sofcograha.gajiidapi.base.mst.report.entities.Report;
  26. import id.co.sofcograha.gajiidapi.base.mst.report.repositories.ReportRepository;
  27. import id.co.sofcograha.gajiidapi.base.mst.reportlog.entities.ReportLog;
  28. import id.co.sofcograha.gajiidapi.base.mst.reportlog.repositories.ReportLogRepository;
  29. import id.co.sofcograha.gajiidapi.base.mst.user.entities.User;
  30. import id.co.sofcograha.gajiidapi.base.mst.user.repositories.UserRepository;
  31. import id.co.sofcograha.gajiidapi.base.pojos.Base64StringEncodedPojo;
  32. import id.co.sofcograha.gajiidapi.base.utils.FileUtil;
  33. import id.co.sofcograha.gajiidapi.base.utils.StringUtil;
  34. import id.co.sofcograha.gajiidapi.base.utils.TimeUtil;
  35. import net.sf.jasperreports.engine.JRAbstractExporter;
  36. import net.sf.jasperreports.engine.JRDataSource;
  37. import net.sf.jasperreports.engine.JRException;
  38. import net.sf.jasperreports.engine.JasperCompileManager;
  39. import net.sf.jasperreports.engine.JasperFillManager;
  40. import net.sf.jasperreports.engine.JasperPrint;
  41. import net.sf.jasperreports.engine.JasperReport;
  42. import net.sf.jasperreports.engine.data.ListOfArrayDataSource;
  43. import net.sf.jasperreports.engine.export.JRPdfExporter;
  44. import net.sf.jasperreports.engine.export.JRXlsExporter;
  45. import net.sf.jasperreports.export.SimpleExporterInput;
  46. import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
  47. import net.sf.jasperreports.export.SimplePdfExporterConfiguration;
  48. import net.sf.jasperreports.export.SimpleXlsReportConfiguration;
  49.  
  50. @Component
  51. @RequestScope
  52. public class ReportGeneratorService extends FreeFormService {
  53.  
  54.     private Log logger = LogFactory.getLog(this.getClass());
  55.  
  56.     @Autowired
  57.     private ReportRepository reportRepository;
  58.  
  59.     @Autowired
  60.     private ReportLogRepository reportLogRepository;
  61.  
  62.     @Autowired
  63.     private UserRepository userRepository;
  64.  
  65.     private final String PDF_OWNER_PASSWORD = "gaji.id";
  66.     private final String CONTENT_TYPE_PDF = "application/pdf";
  67.     private final String PDF_SUFIX = ".pdf";
  68.     private final String CONTENT_TYPE_EXCEL = "application/vnd.ms-excel";
  69.     private final String EXCEL_SUFIX = ".xls";
  70.  
  71.     public ResponseEntity<byte[]> generateJasperXlsFile(HttpServletResponse response,
  72.                                                         String reportId,
  73.                                                         String generatedFileName,
  74.                                                         Map<String, Object> parameters,
  75.                                                         List<Object[]> records,
  76.                                                         String[] columnNames) {
  77.        
  78.         logger.debug("START generate jasper report: " + reportId);
  79.  
  80.         Report report = getAndValidateReportEntityFromDB(reportId);
  81.  
  82.         String jrxmlFileName = report.getTemplateFile();
  83.         validateJrxmlFile(jrxmlFileName);
  84.  
  85.         JasperPrint jasperPrint = processJasperReport(jrxmlFileName, parameters, records, columnNames);
  86.         SimpleXlsReportConfiguration config = new SimpleXlsReportConfiguration();
  87.         config.setDetectCellType(true);
  88.         config.setOnePagePerSheet(true);
  89.         JRXlsExporter exporter = new JRXlsExporter();
  90.         exporter.setConfiguration(config);
  91.         ByteArrayOutputStream baos = generateReport(jasperPrint, exporter);
  92.  
  93.         prepareHttpResponse(response, CONTENT_TYPE_EXCEL, generatedFileName + EXCEL_SUFIX);
  94.  
  95.         saveReportLog(report);
  96.  
  97.         logger.debug("FINISH generate jasper report: " + reportId);
  98.         return new ResponseEntity<>(baos.toByteArray(), HttpStatus.OK);
  99.     }
  100.  
  101.     public ResponseEntity<byte[]> generateJasperPdfFile(HttpServletResponse response,
  102.                                                         String reportId,
  103.                                                         String generatedFileName,
  104.                                                         Map<String, Object> parameters,
  105.                                                         List<Object[]> records,
  106.                                                         String[] columnNames) {
  107.         return generateJasperPdfFile(response, reportId, generatedFileName, parameters, records, columnNames, null);
  108.     }
  109.  
  110.     public ResponseEntity<byte[]> generateJasperPdfFile(HttpServletResponse response,
  111.                                                         String reportId,
  112.                                                         String generatedFileName,
  113.                                                         Map<String, Object> parameters,
  114.                                                         List<Object[]> records,
  115.                                                         String[] columnNames,
  116.                                                         String password) {
  117.        
  118.         logger.debug("START generate jasper report: " + reportId);
  119.  
  120.         Report report = getAndValidateReportEntityFromDB(reportId);
  121.  
  122.         String jrxmlFileName = report.getTemplateFile();
  123.         validateJrxmlFile(jrxmlFileName);
  124.  
  125.         JasperPrint jasperPrint = processJasperReport(jrxmlFileName, parameters, records, columnNames);
  126.         JRPdfExporter exporter = new JRPdfExporter();
  127.         if (password != null && !password.isEmpty()) {
  128.             SimplePdfExporterConfiguration config = new SimplePdfExporterConfiguration();
  129.             config.setEncrypted(true);
  130.             config.set128BitKey(true);
  131.             config.setUserPassword(password);
  132.             config.setOwnerPassword(PDF_OWNER_PASSWORD);
  133.             config.setPermissions(PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING);
  134.             exporter.setConfiguration(config);
  135.         }
  136.         ByteArrayOutputStream baos = generateReport(jasperPrint, exporter);
  137.  
  138.         prepareHttpResponse(response, CONTENT_TYPE_PDF, generatedFileName + PDF_SUFIX);
  139.  
  140.         saveReportLog(report);
  141.  
  142.         logger.debug("FINISH generate jasper report: " + reportId);
  143.         return new ResponseEntity<>(baos.toByteArray(), HttpStatus.OK);
  144.     }
  145.    
  146.     public Base64StringEncodedPojo generateBase64PdfReportFile(String reportId,
  147.                                                                String generatedFileName,
  148.                                                                Map<String, Object> parameters,
  149.                                                                List<Object[]> records,
  150.                                                                String[] columnNames) {
  151.         return generateBase64PdfReportFile(reportId,
  152.                                            generatedFileName,
  153.                                            parameters,
  154.                                            records,
  155.                                            columnNames,
  156.                                            null);
  157.     }
  158.    
  159.     public Base64StringEncodedPojo generateBase64PdfReportFile(String reportId,
  160.                                                                String generatedFileName,
  161.                                                                Map<String, Object> parameters,
  162.                                                                List<Object[]> records,
  163.                                                                String[] columnNames,
  164.                                                                String password) {
  165.        
  166.         logger.debug("START generate jasper report: " + reportId);
  167.  
  168.         Report report = getAndValidateReportEntityFromDB(reportId);
  169.  
  170.         String jrxmlFileName = report.getTemplateFile();
  171.         validateJrxmlFile(jrxmlFileName);
  172.  
  173.         JasperPrint jasperPrint = processJasperReport(jrxmlFileName, parameters, records, columnNames);
  174.         JRPdfExporter exporter = new JRPdfExporter();
  175.         if (password != null && !password.isEmpty()) {
  176.             SimplePdfExporterConfiguration config = new SimplePdfExporterConfiguration();
  177.             config.setEncrypted(true);
  178.             config.set128BitKey(true);
  179.             config.setUserPassword(password);
  180.             config.setOwnerPassword(PDF_OWNER_PASSWORD);
  181.             config.setPermissions(PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING);
  182.             exporter.setConfiguration(config);
  183.         }
  184.         ByteArrayOutputStream baos = generateReport(jasperPrint, exporter);
  185.         saveReportLog(report);
  186.        
  187.         return new Base64StringEncodedPojo(CONTENT_TYPE_PDF, Base64.getEncoder().encodeToString(baos.toByteArray()));
  188.     }
  189.  
  190.     @SuppressWarnings("unchecked")
  191.     private ByteArrayOutputStream generateReport(JasperPrint jasperPrint,
  192.             @SuppressWarnings("rawtypes") JRAbstractExporter exporter) {
  193.         ByteArrayOutputStream baos = new ByteArrayOutputStream();
  194.         try {
  195.             exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
  196.             exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(baos));
  197.  
  198.             exporter.exportReport();
  199.         } catch (JRException e) {
  200.             logger.error("report.jrxml.exportReport.error", e);
  201.             error("report.jrxml.exportReport.error");
  202.         } finally {
  203.             try {
  204.                 baos.close();
  205.             } catch (IOException e) {
  206.                 logger.error("report.io.error", e);
  207.                 error("report.io.error");
  208.             }
  209.         }
  210.  
  211.         return baos;
  212.     }
  213.  
  214.     private JasperPrint processJasperReport(String jrxmlFileName, Map<String, Object> parameters,
  215.             List<Object[]> records, String[] columnNames) {
  216.         InputStream jrxmlFile = FileUtil.getJrxmlFile(jrxmlFileName);
  217.  
  218.         JasperReport jasperReport = null;
  219.         try {
  220.             jasperReport = JasperCompileManager.compileReport(jrxmlFile);
  221.         } catch (JRException e) {
  222.             logger.error("report.jrxml.compileReport.error", e);
  223.             error("report.jrxml.compileReport.error");
  224.         }
  225.  
  226.         JasperPrint jasperPrint = null;
  227.         JRDataSource dataSource = new ListOfArrayDataSource(records, columnNames);
  228.         try {
  229.             jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
  230.         } catch (JRException e) {
  231.             logger.error("report.jrxml.fillReport.error", e);
  232.             error("report.jrxml.fillReport.error");
  233.         }
  234.  
  235.         return jasperPrint;
  236.     }
  237.  
  238.     private void validateJrxmlFile(String jrxmlFileName) {
  239.         if (StringUtil.isBlank(jrxmlFileName)) {
  240.             error("report.jrxml.fileName.required");
  241.         }
  242.         if (FileUtil.getJrxmlFile(jrxmlFileName) == null) {
  243.             error("report.jrxml.file.not.found", jrxmlFileName);
  244.         }
  245.     }
  246.  
  247.     private void prepareHttpResponse(HttpServletResponse response, String contentType, String fileNameWithExtension) {
  248.         response.setContentType(contentType);
  249.         response.setHeader("Content-disposition", "attachment; filename = " + fileNameWithExtension);
  250.  
  251.         try {
  252.             response.flushBuffer();
  253.         } catch (IOException e) {
  254.             logger.error("report.io.error", e);
  255.             error("report.io.error");
  256.         }
  257.     }
  258.  
  259.     private Report getAndValidateReportEntityFromDB(String reportId) {
  260.         Report result = reportRepository.findByBK(reportId).orElse(null);
  261.         if (result == null)
  262.             error("report.jrxml.reportId.not.found", reportId);
  263.         if (!result.getActive())
  264.             error("report.jrxml.reportId.not.active", reportId);
  265.  
  266.         return result;
  267.     }
  268.  
  269.     private void saveReportLog(Report report) {
  270.         Date systemDateTime = TimeUtil.getSystemDateTime();
  271.         String yearMonth = TimeUtil.getFourDigitYear(systemDateTime) + TimeUtil.getTwoDigitMonth(systemDateTime);
  272.         Integer nextSeq = getNextSeq(report, yearMonth);
  273.         User currentUser = userRepository.getOne(CurrentUser.getUserId());
  274.  
  275.         ReportLog reportLog = new ReportLog();
  276.         reportLog.setReport(report);
  277.         reportLog.setYearMonth(yearMonth);
  278.         reportLog.setNumberSeq(nextSeq);
  279.         reportLog.setUser(currentUser);
  280.         reportLog.setReportDate(systemDateTime);
  281.  
  282.         reportLogRepository.saveAndFlush(reportLog);
  283.     }
  284.  
  285.     private Integer getNextSeq(Report report, String yearMonth) {
  286.         Integer result = 0;
  287.         ReportLog lastSeqReportLogByReportAndYearMonth = reportLogRepository
  288.                 .getLastSeqReportLogByReportAndYearMonth(report, yearMonth).orElse(null);
  289.         if (lastSeqReportLogByReportAndYearMonth != null)
  290.             result = lastSeqReportLogByReportAndYearMonth.getNumberSeq() + 1;
  291.  
  292.         return result;
  293.     }
  294. }
Advertisement
Add Comment
Please, Sign In to add comment