305 lines
11 KiB
Java
305 lines
11 KiB
Java
package net.sf.jasperreports.engine.xml;
|
|
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.HashSet;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import javax.xml.parsers.ParserConfigurationException;
|
|
import net.sf.jasperreports.engine.JRDatasetRun;
|
|
import net.sf.jasperreports.engine.JRException;
|
|
import net.sf.jasperreports.engine.JRGroup;
|
|
import net.sf.jasperreports.engine.JRVariable;
|
|
import net.sf.jasperreports.engine.design.JRDesignChart;
|
|
import net.sf.jasperreports.engine.design.JRDesignDataset;
|
|
import net.sf.jasperreports.engine.design.JRDesignElement;
|
|
import net.sf.jasperreports.engine.design.JRDesignElementDataset;
|
|
import net.sf.jasperreports.engine.design.JRDesignImage;
|
|
import net.sf.jasperreports.engine.design.JRDesignTextField;
|
|
import net.sf.jasperreports.engine.design.JRDesignVariable;
|
|
import net.sf.jasperreports.engine.design.JRValidationException;
|
|
import net.sf.jasperreports.engine.design.JasperDesign;
|
|
import org.apache.commons.digester.Digester;
|
|
import org.xml.sax.InputSource;
|
|
import org.xml.sax.SAXException;
|
|
|
|
public class JRXmlLoader {
|
|
private JasperDesign jasperDesign = null;
|
|
|
|
private Collection groupReprintedElements = new ArrayList();
|
|
|
|
private Collection groupEvaluatedImages = new ArrayList();
|
|
|
|
private Collection groupEvaluatedTextFields = new ArrayList();
|
|
|
|
private Collection groupEvaluatedCharts = new ArrayList();
|
|
|
|
private Set groupBoundDatasets = new HashSet();
|
|
|
|
private List errors = new ArrayList();
|
|
|
|
private Digester digester = null;
|
|
|
|
private boolean ignoreConsistencyProblems;
|
|
|
|
public JRXmlLoader(Digester digester) {
|
|
this.digester = digester;
|
|
}
|
|
|
|
public void setJasperDesign(JasperDesign jasperDesign) {
|
|
this.jasperDesign = jasperDesign;
|
|
}
|
|
|
|
public Collection getGroupReprintedElements() {
|
|
return this.groupReprintedElements;
|
|
}
|
|
|
|
public Collection getGroupEvaluatedImages() {
|
|
return this.groupEvaluatedImages;
|
|
}
|
|
|
|
public Collection getGroupEvaluatedTextFields() {
|
|
return this.groupEvaluatedTextFields;
|
|
}
|
|
|
|
public Collection getGroupEvaluatedCharts() {
|
|
return this.groupEvaluatedCharts;
|
|
}
|
|
|
|
public Set getGroupBoundDatasets() {
|
|
return this.groupBoundDatasets;
|
|
}
|
|
|
|
public static JasperDesign load(String sourceFileName) throws JRException {
|
|
return load(new File(sourceFileName));
|
|
}
|
|
|
|
public static JasperDesign load(File file) throws JRException {
|
|
JasperDesign jasperDesign = null;
|
|
FileInputStream fis = null;
|
|
try {
|
|
fis = new FileInputStream(file);
|
|
jasperDesign = load(fis);
|
|
} catch (IOException e) {
|
|
throw new JRException(e);
|
|
} finally {
|
|
if (fis != null)
|
|
try {
|
|
fis.close();
|
|
} catch (IOException e) {}
|
|
}
|
|
return jasperDesign;
|
|
}
|
|
|
|
public static JasperDesign load(InputStream is) throws JRException {
|
|
JasperDesign jasperDesign = null;
|
|
JRXmlLoader xmlLoader = null;
|
|
try {
|
|
xmlLoader = new JRXmlLoader(JRXmlDigesterFactory.createDigester());
|
|
} catch (ParserConfigurationException e) {
|
|
throw new JRException(e);
|
|
} catch (SAXException e) {
|
|
throw new JRException(e);
|
|
}
|
|
jasperDesign = xmlLoader.loadXML(is);
|
|
return jasperDesign;
|
|
}
|
|
|
|
public JasperDesign loadXML(InputStream is) throws JRException {
|
|
return loadXML(new InputSource(is));
|
|
}
|
|
|
|
public JasperDesign loadXML(InputSource is) throws JRException {
|
|
try {
|
|
this.digester.push(this);
|
|
this.digester.parse(is);
|
|
} catch (SAXException e) {
|
|
throw new JRException(e);
|
|
} catch (IOException e) {
|
|
throw new JRException(e);
|
|
} finally {
|
|
this.digester.clear();
|
|
}
|
|
if (this.errors.size() > 0) {
|
|
Exception e = this.errors.get(0);
|
|
if (e instanceof JRException)
|
|
throw (JRException)e;
|
|
throw new JRException(e);
|
|
}
|
|
assignGroupsToVariables(this.jasperDesign.getMainDesignDataset());
|
|
for (Iterator it = this.jasperDesign.getDatasetsList().iterator(); it.hasNext(); ) {
|
|
JRDesignDataset dataset = it.next();
|
|
assignGroupsToVariables(dataset);
|
|
}
|
|
assignGroupsToElements();
|
|
assignGroupsToImages();
|
|
assignGroupsToTextFields();
|
|
assignGroupsToCharts();
|
|
assignGroupsToDatasets();
|
|
return this.jasperDesign;
|
|
}
|
|
|
|
private void assignGroupsToVariables(JRDesignDataset dataset) throws JRException {
|
|
JRVariable[] variables = dataset.getVariables();
|
|
if (variables != null && variables.length > 0) {
|
|
Map groupsMap = dataset.getGroupsMap();
|
|
for (int i = 0; i < variables.length; i++) {
|
|
JRDesignVariable variable = (JRDesignVariable)variables[i];
|
|
if (variable.getResetType() == 4) {
|
|
String groupName = null;
|
|
JRGroup group = variable.getResetGroup();
|
|
if (group != null) {
|
|
groupName = group.getName();
|
|
group = (JRGroup)groupsMap.get(groupName);
|
|
}
|
|
if (!this.ignoreConsistencyProblems && group == null)
|
|
throw new JRValidationException("Unknown reset group '" + groupName + "' for variable : " + variable.getName(), variable);
|
|
variable.setResetGroup(group);
|
|
} else {
|
|
variable.setResetGroup(null);
|
|
}
|
|
if (variable.getIncrementType() == 4) {
|
|
String groupName = null;
|
|
JRGroup group = variable.getIncrementGroup();
|
|
if (group != null) {
|
|
groupName = group.getName();
|
|
group = (JRGroup)groupsMap.get(groupName);
|
|
}
|
|
if (!this.ignoreConsistencyProblems && group == null)
|
|
throw new JRValidationException("Unknown increment group '" + groupName + "' for variable : " + variable.getName(), variable);
|
|
variable.setIncrementGroup(group);
|
|
} else {
|
|
variable.setIncrementGroup(null);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void assignGroupsToElements() throws JRException {
|
|
Map groupsMap = this.jasperDesign.getGroupsMap();
|
|
for (Iterator it = this.groupReprintedElements.iterator(); it.hasNext(); ) {
|
|
JRDesignElement element = it.next();
|
|
String groupName = null;
|
|
JRGroup group = element.getPrintWhenGroupChanges();
|
|
if (group != null) {
|
|
groupName = group.getName();
|
|
group = (JRGroup)groupsMap.get(group.getName());
|
|
}
|
|
if (!this.ignoreConsistencyProblems && group == null)
|
|
throw new JRValidationException("Unknown reprint group '" + groupName + "' for element.", element);
|
|
element.setPrintWhenGroupChanges(group);
|
|
}
|
|
}
|
|
|
|
private void assignGroupsToImages() throws JRException {
|
|
Map groupsMap = this.jasperDesign.getGroupsMap();
|
|
for (Iterator it = this.groupEvaluatedImages.iterator(); it.hasNext(); ) {
|
|
JRDesignImage image = it.next();
|
|
String groupName = null;
|
|
JRGroup group = image.getEvaluationGroup();
|
|
if (group != null) {
|
|
groupName = group.getName();
|
|
group = (JRGroup)groupsMap.get(group.getName());
|
|
}
|
|
if (!this.ignoreConsistencyProblems && group == null)
|
|
throw new JRValidationException("Unknown evaluation group '" + groupName + "' for image.", image);
|
|
image.setEvaluationGroup(group);
|
|
}
|
|
}
|
|
|
|
private void assignGroupsToTextFields() throws JRException {
|
|
Map groupsMap = this.jasperDesign.getGroupsMap();
|
|
for (Iterator it = this.groupEvaluatedTextFields.iterator(); it.hasNext(); ) {
|
|
JRDesignTextField textField = it.next();
|
|
String groupName = null;
|
|
JRGroup group = textField.getEvaluationGroup();
|
|
if (group != null) {
|
|
groupName = group.getName();
|
|
group = (JRGroup)groupsMap.get(group.getName());
|
|
}
|
|
if (!this.ignoreConsistencyProblems && group == null)
|
|
throw new JRValidationException("Unknown evaluation group '" + groupName + "' for text field.", textField);
|
|
textField.setEvaluationGroup(group);
|
|
}
|
|
}
|
|
|
|
private void assignGroupsToCharts() throws JRException {
|
|
Map groupsMap = this.jasperDesign.getGroupsMap();
|
|
for (Iterator it = this.groupEvaluatedCharts.iterator(); it.hasNext(); ) {
|
|
JRDesignChart chart = it.next();
|
|
String groupName = null;
|
|
JRGroup group = chart.getEvaluationGroup();
|
|
if (group != null) {
|
|
groupName = group.getName();
|
|
group = (JRGroup)groupsMap.get(group.getName());
|
|
}
|
|
if (!this.ignoreConsistencyProblems && group == null)
|
|
throw new JRValidationException("Unknown evaluation group '" + groupName + "' for chart.", chart);
|
|
chart.setEvaluationGroup(group);
|
|
}
|
|
}
|
|
|
|
private void assignGroupsToDatasets() throws JRException {
|
|
for (Iterator it = this.groupBoundDatasets.iterator(); it.hasNext(); ) {
|
|
Map groupsMap;
|
|
JRDesignElementDataset dataset = it.next();
|
|
JRDatasetRun datasetRun = dataset.getDatasetRun();
|
|
if (datasetRun == null) {
|
|
groupsMap = this.jasperDesign.getGroupsMap();
|
|
} else {
|
|
Map datasetMap = this.jasperDesign.getDatasetMap();
|
|
String datasetName = datasetRun.getDatasetName();
|
|
JRDesignDataset subDataset = (JRDesignDataset)datasetMap.get(datasetName);
|
|
if (subDataset == null)
|
|
throw new JRException("Unknown sub dataset '" + datasetName + "' for chart dataset.");
|
|
groupsMap = subDataset.getGroupsMap();
|
|
}
|
|
if (dataset.getIncrementType() == 4) {
|
|
String groupName = null;
|
|
JRGroup group = dataset.getIncrementGroup();
|
|
if (group != null) {
|
|
groupName = group.getName();
|
|
group = (JRGroup)groupsMap.get(group.getName());
|
|
}
|
|
if (!this.ignoreConsistencyProblems && group == null)
|
|
throw new JRValidationException("Unknown increment group '" + groupName + "' for chart dataset.", dataset);
|
|
dataset.setIncrementGroup(group);
|
|
} else {
|
|
dataset.setIncrementGroup(null);
|
|
}
|
|
if (dataset.getResetType() == 4) {
|
|
String groupName = null;
|
|
JRGroup group = dataset.getResetGroup();
|
|
if (group != null) {
|
|
groupName = group.getName();
|
|
group = (JRGroup)groupsMap.get(group.getName());
|
|
}
|
|
if (!this.ignoreConsistencyProblems && group == null)
|
|
throw new JRValidationException("Unknown reset group '" + groupName + "' for chart dataset.", dataset);
|
|
dataset.setResetGroup(group);
|
|
continue;
|
|
}
|
|
dataset.setResetGroup(null);
|
|
}
|
|
}
|
|
|
|
public void addError(Exception e) {
|
|
if (!this.ignoreConsistencyProblems)
|
|
this.errors.add(e);
|
|
}
|
|
|
|
public boolean isIgnoreConsistencyProblems() {
|
|
return this.ignoreConsistencyProblems;
|
|
}
|
|
|
|
public void setIgnoreConsistencyProblems(boolean ignoreConsistencyProblems) {
|
|
this.ignoreConsistencyProblems = ignoreConsistencyProblems;
|
|
}
|
|
}
|