This commit is contained in:
2014-06-06 19:04:47 +02:00
26 changed files with 557 additions and 116 deletions
@@ -61,6 +61,7 @@ public class Constants {
public final static String DYNAMIC_REPORT_NAME = "Tabulková sestava";
public final static ReportMapping REPORTS[] = {
new ReportMapping(MOD_ADDRESSBOOK, new Report("Pokusná sestava", "report"))
new ReportMapping(MOD_ADDRESSBOOK, new Report("Adresní karty", "address")),
new ReportMapping(MOD_ADDRESSBOOK, new Report("Adresna", "address", false, true))
};
}
@@ -28,7 +28,7 @@ public class StringUtils {
}
public static String localize(String key) {
return Labels.getLabel(key);
return Labels.getLabel(key) == null ? key : Labels.getLabel(key);
}
private static String getLocalized(String str) {
@@ -1,5 +1,7 @@
package info.bukova.isspst.reporting;
import info.bukova.isspst.StringUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.List;
@@ -49,13 +51,11 @@ public class DynamicGenerator implements Generator {
Class<?> clazz = colClass(col);
if (clazz != null) {
try {
rb.addColumn(col, col, clazz, 30, false);
rb.addColumn(StringUtils.localize(col), col, clazz, 30, false);
} catch (ColumnBuilderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new ReportException(e);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new ReportException(e);
}
}
}
@@ -70,11 +70,8 @@ public class DynamicGenerator implements Generator {
JasperReport report = DynamicJasperHelper.generateJasperReport(dr, new ClassicLayoutManager(), definition.getParams());
return JasperRunManager.runReportToPdf(report, definition.getParams(), ds);
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new ReportException(e);
}
return null;
}
private Class<?> colClass(String col) {
@@ -1,11 +1,20 @@
package info.bukova.isspst.reporting;
import javax.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired;
public class GeneratorFactory {
@Autowired
private ServletContext context;
public Generator createGenerator(ReportDefinition definition) {
switch (definition.getReport().getType()) {
case DYNAMIC:
return new DynamicGenerator(definition);
case DEFINED:
return new PredefinedGenerator(definition, context);
default:
return null;
@@ -0,0 +1,44 @@
package info.bukova.isspst.reporting;
import java.io.File;
import javax.servlet.ServletContext;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.util.JRProperties;
@SuppressWarnings("deprecation")
public class PredefinedGenerator implements Generator {
private ReportDefinition definition;
private ServletContext ctx;
public PredefinedGenerator(ReportDefinition definition, ServletContext ctx) {
this.definition = definition;
this.ctx = ctx;
}
@Override
public byte[] generate() {
byte[] bytes = null;
try {
JasperReport report = (JasperReport) JRLoader.loadObject(getReportFile());
JRProperties.setProperty("net.sf.jasperreports.default.pdf.encoding", "Cp1250");
bytes = JasperRunManager.runReportToPdf(report, definition.getParams(), new JRBeanCollectionDataSource(definition.getDataSet()));;
} catch (JRException e) {
throw new ReportException(e);
}
return bytes;
}
protected File getReportFile() {
return new File(ctx.getRealPath("WEB-INF/reports") + "/" + definition.getReport().getJasperFile() + ".jasper");
}
}
@@ -6,16 +6,45 @@ public class Report {
private ReportType type;
private String name;
private String jasperFile;
private boolean hasSettings;
private boolean singleRecord;
public Report() {
hasSettings = false;
singleRecord = false;
}
/**
* @param name
* @param jasperFile
*/
public Report(String name, String jasperFile) {
this();
this.type = ReportType.DEFINED;
this.name = name;
this.jasperFile = jasperFile;
}
/**
* @param name
* @param jasperFile
* @param hasSettings
*/
public Report(String name, String jasperFile, boolean hasSettings) {
this(name, jasperFile);
this.hasSettings = hasSettings;
}
/**
* @param name
* @param jasperFile
* @param hasSettings
* @param singleRecord
*/
public Report(String name, String jasperFile, boolean hasSettings, boolean singleRecord) {
this(name, jasperFile, hasSettings);
this.singleRecord = singleRecord;
}
public ReportType getType() {
return type;
@@ -41,4 +70,20 @@ public class Report {
this.jasperFile = jasperFile;
}
public boolean isHasSettings() {
return hasSettings;
}
public void setHasSettings(boolean hasSettings) {
this.hasSettings = hasSettings;
}
public boolean isSingleRecord() {
return singleRecord;
}
public void setSingleRecord(boolean singleRecord) {
this.singleRecord = singleRecord;
}
}
@@ -1,6 +1,7 @@
package info.bukova.isspst.reporting;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
@@ -16,38 +17,46 @@ public class ReportController {
private ReportDefinition reportDefinition;
@Autowired
private GeneratorFactory factory;
private static final String ERROR_MESSAGE = "<html><body><b>Generator returned no data!</b><br/>%s</body></html>";
private void writeError(OutputStream stream, Throwable e) {
writeError(stream, e.toString());
}
private void writeError(OutputStream stream, String message) {
String err = String.format(ERROR_MESSAGE, message);
try {
stream.write(err.getBytes(), 0, err.getBytes().length);
} catch (IOException e1) {
e1.printStackTrace();
}
}
@RequestMapping("report.pdf")
public void pdfReport(HttpServletResponse response) {
Generator gen = factory.createGenerator(reportDefinition);
byte[] data = gen.generate();
String contentType = "application/pdf";
final String contentType = "application/pdf";
ServletOutputStream os = null;
try {
os = response.getOutputStream();
} catch (IOException e1) {
e1.printStackTrace();
return;
}
// if (reportDefinition.getReport() == null || reportDefinition.getDataSet() == null) {
// writeError(os, "Definition is null");
// return;
// }
response.setContentType(contentType);
response.setContentLength(data.length);
try {
if (reportDefinition.getReport() == null || reportDefinition.getDataSet() == null) {
throw new ReportException("Definition is null");
}
Generator gen = factory.createGenerator(reportDefinition);
byte[] data = gen.generate();
response.setContentType(contentType);
response.setContentLength(data.length);
os.write(data, 0, data.length);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
// } catch (ReportException e) {
// writeError(os, e);
} catch (ReportException e) {
writeError(os, e);
} finally {
if (os != null) {
try {
@@ -0,0 +1,20 @@
package info.bukova.isspst.reporting;
import info.bukova.isspst.services.IsspstException;
public class ReportException extends IsspstException {
/**
*
*/
private static final long serialVersionUID = 1L;
public ReportException(Throwable cause) {
super("Reporting exception: ", cause);
}
public ReportException(String message) {
super(message);
}
}
@@ -4,7 +4,7 @@ public class IsspstException extends RuntimeException {
private static final long serialVersionUID = 1L;
private final static String MSG = "RsFaktura Exception. ";
private final static String MSG = "IS Exception. ";
public IsspstException() {
super(MSG);
@@ -301,7 +301,8 @@ public class ListViewModel<T extends DataModel> {
Map<String, Object> params = new HashMap<String, Object>();
params.put("reports", service.getReports());
params.put("data", dataList);
Window win = (Window) Executions.createComponents("/app/reportDialog.zul", null, params);
params.put("singleObject", dataBean);
Window win = (Window) Executions.createComponents("/app/reporting/reportDialog.zul", null, params);
win.doModal();
}
@@ -0,0 +1,21 @@
package info.bukova.isspst.ui;
import info.bukova.isspst.StringUtils;
import org.zkoss.bind.BindContext;
import org.zkoss.bind.Converter;
import org.zkoss.zk.ui.Component;
public class LocaleConverter implements Converter<String, String, Component> {
@Override
public String coerceToBean(String str, Component component, BindContext ctx) {
return str;
}
@Override
public String coerceToUi(String str, Component component, BindContext ctx) {
return StringUtils.localize(str);
}
}
@@ -0,0 +1,67 @@
package info.bukova.isspst.ui.reporting;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.List;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.reporting.ReportDefinition;
import info.bukova.isspst.reporting.ReportType;
import info.bukova.isspst.ui.ListChecks;
import info.bukova.isspst.ui.LocaleConverter;
import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.select.annotation.WireVariable;
public class ColSelectVM {
@WireVariable
private ReportDefinition reportDefinition;
private LocaleConverter locConverter;
@Init
public void init() {
locConverter = new LocaleConverter();
}
public ListChecks<String> getColumns() {
Report selected = reportDefinition.getReport();
List<Object> data = reportDefinition.getDataSet();
if (selected == null || selected.getType() != ReportType.DYNAMIC) {
return null;
}
if (data == null || data.size() == 0) {
return null;
}
BeanInfo beanInfo;
try {
beanInfo = Introspector.getBeanInfo(data.get(0).getClass());
} catch (IntrospectionException e) {
return null;
}
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
List<String> properties = new ArrayList<String>();
for (PropertyDescriptor pd : pds) {
if (!(pd.getName().equals("password") || pd.getName().equals("class") || pd.getName().equals("id") || pd.getName().equals("valid"))) {
properties.add(pd.getName());
}
}
ListChecks<String> columns = new ListChecks<String>(reportDefinition.getFieldsToPrint(), properties);
return columns;
}
public LocaleConverter getLocConverter() {
return locConverter;
}
public ReportDefinition getReportDefinition() {
return reportDefinition;
}
}
@@ -1,16 +1,11 @@
package info.bukova.isspst.ui;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.List;
package info.bukova.isspst.ui.reporting;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.reporting.ReportDefinition;
import info.bukova.isspst.reporting.ReportType;
import java.util.List;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ExecutionArgParam;
@@ -24,19 +19,23 @@ public class ReportDialogVM {
private List<Report> reports;
private Report selected;
private List<Object> data;
@WireVariable
private ReportDefinition reportDefinition;
private List<Object> dataList;
private Object singleObject;
@Init
public void init(@ExecutionArgParam("reports") List<Report> reports,
@ExecutionArgParam("data") List<Object> data) {
@ExecutionArgParam("data") List<Object> data,
@ExecutionArgParam("singleObject") Object singleObject) {
this.reports = reports;
this.data = data;
if (data != null && data.size() > 0 && data.get(0).getClass() != reportDefinition.gatDataClass()) {
reportDefinition.clear();
}
dataList = data;
this.singleObject = singleObject;
}
public List<Report> getReports() {
@@ -47,50 +46,47 @@ public class ReportDialogVM {
return reportDefinition;
}
public ListChecks<String> getColumns() {
if (selected == null || selected.getType() != ReportType.DYNAMIC) {
return null;
}
if (data == null || data.size() == 0) {
return null;
}
BeanInfo beanInfo;
try {
beanInfo = Introspector.getBeanInfo(data.get(0).getClass());
} catch (IntrospectionException e) {
return null;
}
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
List<String> properties = new ArrayList<String>();
for (PropertyDescriptor pd : pds) {
properties.add(pd.getName());
}
ListChecks<String> columns = new ListChecks<String>(reportDefinition.getFieldsToPrint(), properties);
return columns;
}
public Report getSelected() {
return selected;
}
@NotifyChange("columns")
@NotifyChange({"optionsForm", "selected"})
public void setSelected(Report selected) {
this.selected = selected;
reportDefinition.setReport(selected);
if (selected.isSingleRecord()) {
reportDefinition.setSingleObject(singleObject);
} else {
reportDefinition.setDataSet(dataList);
}
}
@Command
public void print(@BindingParam("window") Window window) {
reportDefinition.setDataSet(data);
reportDefinition.setReport(selected);
if (window != null) {
window.detach();
}
Window reportWin = (Window) Executions.createComponents("/app/report.zul", null, null);
Window reportWin = (Window) Executions.createComponents("/app/reporting/report.zul", null, null);
reportWin.doModal();
}
public String getOptionsForm() {
if (selected != null && selected.getType() == ReportType.DYNAMIC) {
return "/app/reporting/colSelect.zul";
} else if (selected != null && selected.isHasSettings()) {
return "/app/reporting/" + selected.getJasperFile() + ".zul";
} else {
return "/app/reporting/noOptions.zul";
}
}
public Object getSingleObject() {
return singleObject;
}
public void setReportDefinition(ReportDefinition reportDefinition) {
this.reportDefinition = reportDefinition;
}
}
@@ -1,4 +1,4 @@
package info.bukova.isspst.ui;
package info.bukova.isspst.ui.reporting;
import org.zkoss.bind.annotation.Init;