package com.evolveum.midpoint.web.page.admin.reports.dto; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRField; import net.sf.jasperreports.engine.JRParameter; import net.sf.jasperreports.engine.design.JRDesignField; import net.sf.jasperreports.engine.design.JRDesignParameter; import net.sf.jasperreports.engine.design.JRDesignQuery; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.engine.xml.JRXmlWriter; import org.apache.commons.codec.binary.Base64; import com.evolveum.midpoint.schema.util.ReportTypeUtil; //import com.evolveum.midpoint.report.impl.ReportUtils; import com.evolveum.midpoint.util.exception.SchemaException; public class JasperReportDto implements Serializable{ private static final long serialVersionUID = 1L; private String query; private List<JasperReportParameterDto> parameters; private List<JasperReportFieldDto> fields; private String detail; private JasperDesign design; private byte[] jasperReportXml; public JasperReportDto(byte[] jasperReportxml, boolean onlyForPromptingParams) { this.jasperReportXml = jasperReportxml; initFileds(onlyForPromptingParams); } public JasperReportDto(byte[] jasperReportxml) { this(jasperReportxml, false); } private void initFileds(boolean onlyForPromptingParams){ if (jasperReportXml == null){ return; } try { design = ReportTypeUtil.loadJasperDesign(jasperReportXml); query = design.getQuery().getText(); fields = new ArrayList<JasperReportFieldDto>(); for (JRField field : design.getFieldsList()){ fields.add(new JasperReportFieldDto(field.getName(), field.getValueClass(), field.getValueClassName())); } for (JasperReportFieldDto field : fields){ design.removeField(field.getName()); } parameters = new ArrayList<JasperReportParameterDto>(); for (JRParameter parameter : design.getParametersList()){ if (parameter.isSystemDefined()){ continue; } if (onlyForPromptingParams && !parameter.isForPrompting()){ continue; } JasperReportParameterDto p = new JasperReportParameterDto(parameter); parameters.add(p); } for (JasperReportParameterDto param : parameters){ design.removeParameter(param.getName()); } detail = new String(Base64.decodeBase64(jasperReportXml)); } catch (SchemaException e) { // TODO Auto-generated catch block throw new IllegalArgumentException(e); } } public List<JasperReportParameterDto> getParameters() { if (parameters == null){ parameters = new ArrayList<>(); } return parameters; } public List<JasperReportFieldDto> getFields() { if (fields == null){ fields = new ArrayList<>(); } return fields; } public String getQuery() { return query; } public byte[] getTemplate(){ try{ // design.remadgetFields(). design.getFieldsList().clear(); design.getParametersList().clear(); design.getFieldsMap().clear(); design.getParametersMap().clear(); for (JasperReportFieldDto field : fields) { if (field.isEmpty()){ continue; } JRDesignField f = new JRDesignField(); f.setValueClassName(field.getTypeAsString()); f.setValueClass(Class.forName(field.getTypeAsString())); f.setName(field.getName()); design.addField(f); } for (JasperReportParameterDto param : parameters) { if (param.isEmpty()) { continue; } JRDesignParameter p = new JRDesignParameter(); p.setValueClassName(param.getTypeAsString()); p.setValueClass(Class.forName(param.getTypeAsString())); p.setName(param.getName()); p.setForPrompting(param.isForPrompting()); p.setDescription(param.getDescription()); p.setNestedTypeName(param.getNestedTypeAsString()); p.setNestedType(param.getNestedType()); p.getPropertiesMap().setBaseProperties(param.getJRProperties()); // p.getPropertiesMap().setProperty(propName, value); design.addParameter(p); } JasperDesign oldDesign = ReportTypeUtil.loadJasperDesign(jasperReportXml); oldDesign.getParametersList().clear(); oldDesign.getParametersList().addAll(design.getParametersList()); oldDesign.getFieldsList().clear(); oldDesign.getFieldsList().addAll(design.getFieldsList()); JRDesignQuery q = new JRDesignQuery(); q.setLanguage("mql"); q.setText(query); oldDesign.setQuery(q); String reportAsString = JRXmlWriter.writeReport(oldDesign, "UTF-8"); return Base64.encodeBase64(reportAsString.getBytes("UTF-8")); } catch (JRException | ClassNotFoundException | SchemaException | UnsupportedEncodingException ex) { throw new IllegalStateException(ex.getMessage(), ex.getCause()); } } }