diff --git a/pom.xml b/pom.xml
index cc50454..4671334 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,6 +66,12 @@
hwplib
1.1.1
+
+
+ net.sf.jasperreports
+ jasperreports-pdf
+ 7.0.2
+
@@ -75,7 +81,9 @@
${project.artifactId}-${project.version}
- ${basedir}/src/main/resources
+
+ ${basedir}/src/main/resources
+
@@ -117,6 +125,9 @@
**/*.class
+ **/*.ttf
+ *.properties
+ *.xml
diff --git a/src/main/java/cokr/xit/base/docs/jasper/JasperView.java b/src/main/java/cokr/xit/base/docs/jasper/JasperView.java
new file mode 100644
index 0000000..3832275
--- /dev/null
+++ b/src/main/java/cokr/xit/base/docs/jasper/JasperView.java
@@ -0,0 +1,93 @@
+package cokr.xit.base.docs.jasper;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.servlet.view.AbstractView;
+
+import cokr.xit.foundation.Assert;
+import cokr.xit.foundation.data.DataObject;
+import net.sf.jasperreports.engine.JRDataSource;
+import net.sf.jasperreports.engine.JREmptyDataSource;
+import net.sf.jasperreports.engine.JasperFillManager;
+import net.sf.jasperreports.engine.JasperPrint;
+import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
+import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
+import net.sf.jasperreports.engine.data.JRMapArrayDataSource;
+import net.sf.jasperreports.engine.data.JRMapCollectionDataSource;
+import net.sf.jasperreports.export.SimpleExporterInput;
+import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
+import net.sf.jasperreports.pdf.JRPdfExporter;
+
+public class JasperView extends AbstractView {
+ private static final JREmptyDataSource emptySource = new JREmptyDataSource();
+
+ @Override
+ protected void renderMergedOutputModel(Map model, HttpServletRequest hreq, HttpServletResponse hresp) throws Exception {
+ String reportRoot = "/WEB-INF/report";
+ DataObject params = new DataObject()
+ .set("resDir", resDir(hreq.getServletContext().getResource(reportRoot)));
+ Map paramMap = (Map)model.get("params");
+ if (!Assert.isEmpty(paramMap))
+ params.putAll(paramMap);
+
+ JRDataSource datasource = null;
+ Object data = model.get("data");
+ if (data != null) {
+ if (data.getClass().isArray()) {
+ datasource = new JRBeanArrayDataSource((Object[])data);
+ } else if (data instanceof Collection> collection) {
+ datasource = new JRBeanCollectionDataSource(collection);
+ } else {
+ datasource = new JRBeanArrayDataSource(new Object[] {data});
+ }
+ } else {
+ data = model.get("dataMap");
+ if (data != null) {
+ if (data instanceof Collection> collection)
+ datasource = new JRMapCollectionDataSource((Collection