/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved.
* http://www.jaspersoft.com
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is part of JasperReports.
*
* JasperReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JasperReports is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.jasperreports.components;
import java.io.IOException;
import java.util.List;
import net.sf.jasperreports.components.barbecue.BarbecueComponent;
import net.sf.jasperreports.components.barbecue.StandardBarbecueComponent;
import net.sf.jasperreports.components.barcode4j.BarcodeComponent;
import net.sf.jasperreports.components.barcode4j.BarcodeXmlWriter;
import net.sf.jasperreports.components.barcode4j.CodabarComponent;
import net.sf.jasperreports.components.barcode4j.Code128Component;
import net.sf.jasperreports.components.barcode4j.Code39Component;
import net.sf.jasperreports.components.barcode4j.DataMatrixComponent;
import net.sf.jasperreports.components.barcode4j.EAN128Component;
import net.sf.jasperreports.components.barcode4j.EAN13Component;
import net.sf.jasperreports.components.barcode4j.EAN8Component;
import net.sf.jasperreports.components.barcode4j.Interleaved2Of5Component;
import net.sf.jasperreports.components.barcode4j.PDF417Component;
import net.sf.jasperreports.components.barcode4j.POSTNETComponent;
import net.sf.jasperreports.components.barcode4j.RoyalMailCustomerComponent;
import net.sf.jasperreports.components.barcode4j.UPCAComponent;
import net.sf.jasperreports.components.barcode4j.UPCEComponent;
import net.sf.jasperreports.components.barcode4j.USPSIntelligentMailComponent;
import net.sf.jasperreports.components.list.DesignListContents;
import net.sf.jasperreports.components.list.ListComponent;
import net.sf.jasperreports.components.list.ListContents;
import net.sf.jasperreports.components.list.StandardListComponent;
import net.sf.jasperreports.components.table.BaseColumn;
import net.sf.jasperreports.components.table.Cell;
import net.sf.jasperreports.components.table.Column;
import net.sf.jasperreports.components.table.ColumnGroup;
import net.sf.jasperreports.components.table.ColumnVisitor;
import net.sf.jasperreports.components.table.DesignCell;
import net.sf.jasperreports.components.table.GroupCell;
import net.sf.jasperreports.components.table.StandardColumn;
import net.sf.jasperreports.components.table.StandardColumnGroup;
import net.sf.jasperreports.components.table.StandardGroupCell;
import net.sf.jasperreports.components.table.StandardTable;
import net.sf.jasperreports.components.table.TableComponent;
import net.sf.jasperreports.components.table.TableReportContextXmlRule;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.component.Component;
import net.sf.jasperreports.engine.component.ComponentKey;
import net.sf.jasperreports.engine.component.ComponentXmlWriter;
import net.sf.jasperreports.engine.component.XmlDigesterConfigurer;
import net.sf.jasperreports.engine.type.EvaluationTimeEnum;
import net.sf.jasperreports.engine.type.PrintOrderEnum;
import net.sf.jasperreports.engine.util.JRXmlWriteHelper;
import net.sf.jasperreports.engine.util.XmlNamespace;
import net.sf.jasperreports.engine.xml.JRExpressionFactory;
import net.sf.jasperreports.engine.xml.JRXmlWriter;
import net.sf.jasperreports.engine.xml.StyleContainerRule;
import net.sf.jasperreports.engine.xml.XmlConstantPropertyRule;
import net.sf.jasperreports.engine.xml.JRXmlConstants;
import org.apache.commons.digester.Digester;
/**
* XML handler (digester + writer) for built-in component implementations.
*
* @author Lucian Chirita (lucianc@users.sourceforge.net)
* @version $Id: ComponentsXmlHandler.java 3698 2010-04-07 08:39:26Z lucianc $
* @see ComponentsExtensionsRegistryFactory
*/
public class ComponentsXmlHandler implements XmlDigesterConfigurer, ComponentXmlWriter
{
public void configureDigester(Digester digester)
{
addListRules(digester);
addBarbecueRules(digester);
addBarcode4jRules(digester);
addTableRules(digester);
}
protected void addListRules(Digester digester)
{
String listPattern = "*/componentElement/list";
digester.addObjectCreate(listPattern, StandardListComponent.class);
digester.addSetProperties(listPattern,
//properties to be ignored by this rule
new String[]{"printOrder"},
new String[0]);
digester.addRule(listPattern, new XmlConstantPropertyRule(
"printOrder", "printOrderValue", PrintOrderEnum.values()));
String listContentsPattern = listPattern + "/listContents";
digester.addObjectCreate(listContentsPattern, DesignListContents.class);
digester.addSetProperties(listContentsPattern);
digester.addSetNext(listContentsPattern, "setContents");
}
protected void addBarbecueRules(Digester digester)
{
String barcodePattern = "*/componentElement/barbecue";
digester.addObjectCreate(barcodePattern, StandardBarbecueComponent.class);
digester.addSetProperties(barcodePattern,
//properties to be ignored by this rule
new String[]{JRXmlConstants.ATTRIBUTE_evaluationTime},
new String[0]);
digester.addRule(barcodePattern,
new XmlConstantPropertyRule(
JRXmlConstants.ATTRIBUTE_evaluationTime, "evaluationTimeValue",
EvaluationTimeEnum.values()));
String barcodeExpressionPattern = barcodePattern + "/codeExpression";
digester.addFactoryCreate(barcodeExpressionPattern,
JRExpressionFactory.StringExpressionFactory.class.getName());
digester.addCallMethod(barcodeExpressionPattern, "setText", 0);
digester.addSetNext(barcodeExpressionPattern, "setCodeExpression",
JRExpression.class.getName());
String applicationIdentifierExpressionPattern = barcodePattern
+ "/applicationIdentifierExpression";
digester.addFactoryCreate(applicationIdentifierExpressionPattern,
JRExpressionFactory.StringExpressionFactory.class.getName());
digester.addCallMethod(applicationIdentifierExpressionPattern, "setText", 0);
digester.addSetNext(applicationIdentifierExpressionPattern,
"setApplicationIdentifierExpression",
JRExpression.class.getName());
}
protected void addBarcode4jRules(Digester digester)
{
addBaseBarcode4jRules(digester,
"*/componentElement/Codabar",
CodabarComponent.class);
addBaseBarcode4jRules(digester,
"*/componentElement/Code128",
Code128Component.class);
addBaseBarcode4jRules(digester,
"*/componentElement/EAN128",
EAN128Component.class);
addBaseBarcode4jRules(digester,
"*/componentElement/DataMatrix",
DataMatrixComponent.class);
addBaseBarcode4jRules(digester,
"*/componentElement/RoyalMailCustomer",
RoyalMailCustomerComponent.class);
addBaseBarcode4jRules(digester,
"*/componentElement/USPSIntelligentMail",
USPSIntelligentMailComponent.class);
addBaseBarcode4jRules(digester,
"*/componentElement/Code39", Code39Component.class);
addBaseBarcode4jRules(digester,
"*/componentElement/Interleaved2Of5", Interleaved2Of5Component.class);
addBaseBarcode4jRules(digester,
"*/componentElement/UPCA", UPCAComponent.class);
addBaseBarcode4jRules(digester,
"*/componentElement/UPCE", UPCEComponent.class);
addBaseBarcode4jRules(digester,
"*/componentElement/EAN13", EAN13Component.class);
addBaseBarcode4jRules(digester,
"*/componentElement/EAN8", EAN8Component.class);
addBaseBarcode4jRules(digester,
"*/componentElement/POSTNET", POSTNETComponent.class);
addBaseBarcode4jRules(digester,
"*/componentElement/PDF417", PDF417Component.class);
}
protected void addBaseBarcode4jRules(Digester digester,
String barcodePattern, Class barcodeComponentClass)
{
digester.addObjectCreate(barcodePattern, barcodeComponentClass);
digester.addSetProperties(barcodePattern,
//properties to be ignored by this rule
new String[]{JRXmlConstants.ATTRIBUTE_evaluationTime},
new String[0]);
//rule to set evaluation time
digester.addRule(barcodePattern,
new XmlConstantPropertyRule(
JRXmlConstants.ATTRIBUTE_evaluationTime, "evaluationTimeValue",
EvaluationTimeEnum.values()));
String codeExpressionPattern = barcodePattern + "/codeExpression";
digester.addFactoryCreate(codeExpressionPattern,
JRExpressionFactory.StringExpressionFactory.class.getName());
digester.addCallMethod(codeExpressionPattern, "setText", 0);
digester.addSetNext(codeExpressionPattern, "setCodeExpression",
JRExpression.class.getName());
String patternExpressionPattern = barcodePattern + "/patternExpression";
digester.addFactoryCreate(patternExpressionPattern,
JRExpressionFactory.StringExpressionFactory.class.getName());
digester.addCallMethod(patternExpressionPattern, "setText", 0);
digester.addSetNext(patternExpressionPattern, "setPatternExpression",
JRExpression.class.getName());
}
protected void addTableRules(Digester digester)
{
String tablePattern = "*/componentElement/table";
digester.addObjectCreate(tablePattern, StandardTable.class);
String columnPattern = "*/column";
digester.addObjectCreate(columnPattern, StandardColumn.class);
digester.addSetNext(columnPattern, "addColumn");
digester.addSetProperties(columnPattern);
addExpressionRules(digester, columnPattern + "/printWhenExpression",
JRExpressionFactory.BooleanExpressionFactory.class, "setPrintWhenExpression",
true);
addTableCellRules(digester, columnPattern + "/tableHeader", "setTableHeader");
addTableCellRules(digester, columnPattern + "/tableFooter", "setTableFooter");
addTableGroupCellRules(digester, columnPattern + "/groupHeader", "addGroupHeader");
addTableGroupCellRules(digester, columnPattern + "/groupFooter", "addGroupFooter");
addTableCellRules(digester, columnPattern + "/columnHeader", "setColumnHeader");
addTableCellRules(digester, columnPattern + "/columnFooter", "setColumnFooter");
addTableCellRules(digester, columnPattern + "/detailCell", "setDetailCell");
String columnGroupPattern = "*/columnGroup";
digester.addObjectCreate(columnGroupPattern, StandardColumnGroup.class);
digester.addSetNext(columnGroupPattern, "addColumn");
digester.addSetProperties(columnGroupPattern);
addExpressionRules(digester, columnGroupPattern + "/printWhenExpression",
JRExpressionFactory.BooleanExpressionFactory.class, "setPrintWhenExpression",
true);
addTableCellRules(digester, columnGroupPattern + "/tableHeader", "setTableHeader");
addTableCellRules(digester, columnGroupPattern + "/tableFooter", "setTableFooter");
addTableGroupCellRules(digester, columnGroupPattern + "/groupHeader", "addGroupHeader");
addTableGroupCellRules(digester, columnGroupPattern + "/groupFooter", "addGroupFooter");
addTableCellRules(digester, columnGroupPattern + "/columnHeader", "setColumnHeader");
addTableCellRules(digester, columnGroupPattern + "/columnFooter", "setColumnFooter");
}
protected void addTableCellRules(Digester digester, String pattern,
String setNextMethod)
{
digester.addObjectCreate(pattern, DesignCell.class);
digester.addSetNext(pattern, setNextMethod);
// rule to set the context dataset name
digester.addRule(pattern, new TableReportContextXmlRule());
digester.addSetProperties(pattern,
new String[]{JRXmlConstants.ATTRIBUTE_style},
new String[0]);
digester.addRule(pattern, new StyleContainerRule());
}
protected void addTableGroupCellRules(Digester digester, String pattern,
String setNextMethod)
{
digester.addObjectCreate(pattern, StandardGroupCell.class);
digester.addSetProperties(pattern);
addTableCellRules(digester, pattern + "/cell", "setCell");
digester.addSetNext(pattern, setNextMethod);
}
protected void addExpressionRules(Digester digester, String expressionPattern,
Class factoryClass, String setterMethod, boolean jrNamespace)
{
String originalNamespace = digester.getRuleNamespaceURI();
if (jrNamespace)
{
digester.setRuleNamespaceURI(JRXmlWriter.JASPERREPORTS_NAMESPACE.getNamespaceURI());
}
digester.addFactoryCreate(expressionPattern, factoryClass);
digester.addCallMethod(expressionPattern, "setText", 0);
digester.addSetNext(expressionPattern, setterMethod,
JRExpression.class.getName());
if (jrNamespace)
{
digester.setRuleNamespaceURI(originalNamespace);
}
}
public void writeToXml(ComponentKey componentKey, Component component,
JRXmlWriter reportWriter) throws IOException
{
if (component instanceof ListComponent)
{
ListComponent list = (ListComponent) component;
writeList(list, componentKey, reportWriter);
}
else if (component instanceof TableComponent)
{
TableComponent table = (TableComponent) component;
writeTable(table, componentKey, reportWriter);
}
else if (component instanceof BarbecueComponent)
{
BarbecueComponent barcode = (BarbecueComponent) component;
writeBarbecue(barcode, componentKey, reportWriter);
}
else if (component instanceof BarcodeComponent)
{
BarcodeComponent barcode = (BarcodeComponent) component;
BarcodeXmlWriter barcodeWriter = new BarcodeXmlWriter(
reportWriter, barcode, componentKey);
barcodeWriter.writeBarcode();
}
}
protected void writeList(ListComponent list, ComponentKey componentKey,
JRXmlWriter reportWriter) throws IOException
{
JRXmlWriteHelper writer = reportWriter.getXmlWriteHelper();
XmlNamespace namespace = new XmlNamespace(
ComponentsExtensionsRegistryFactory.NAMESPACE,
componentKey.getNamespacePrefix(),
ComponentsExtensionsRegistryFactory.XSD_LOCATION);
writer.startElement("list", namespace);
writer.addAttribute("printOrder", list.getPrintOrderValue());
writer.addAttribute("ignoreWidth", list.getIgnoreWidth());
reportWriter.writeDatasetRun(list.getDatasetRun());
ListContents contents = list.getContents();
writer.startElement("listContents");
writer.addAttribute("height", contents.getHeight());
writer.addAttribute("width", contents.getWidth());
reportWriter.writeChildElements(contents);
writer.closeElement();
writer.closeElement();
}
protected void writeBarbecue(BarbecueComponent barcode, ComponentKey componentKey,
JRXmlWriter reportWriter) throws IOException
{
JRXmlWriteHelper writer = reportWriter.getXmlWriteHelper();
XmlNamespace namespace = new XmlNamespace(
ComponentsExtensionsRegistryFactory.NAMESPACE,
componentKey.getNamespacePrefix(),
ComponentsExtensionsRegistryFactory.XSD_LOCATION);
writer.startElement("barbecue", namespace);
writer.addAttribute("type", barcode.getType());
writer.addAttribute("drawText", barcode.isDrawText());
writer.addAttribute("checksumRequired", barcode.isChecksumRequired());
writer.addAttribute("barWidth", barcode.getBarWidth());
writer.addAttribute("barHeight", barcode.getBarHeight());
if (barcode.getEvaluationTimeValue() != EvaluationTimeEnum.NOW)
{
writer.addAttribute(JRXmlConstants.ATTRIBUTE_evaluationTime,
barcode.getEvaluationTimeValue());
}
writer.addAttribute(JRXmlConstants.ATTRIBUTE_evaluationGroup,
barcode.getEvaluationGroup());
writer.writeExpression("codeExpression",
barcode.getCodeExpression(), false);
writer.writeExpression("applicationIdentifierExpression",
barcode.getApplicationIdentifierExpression(), false);
writer.closeElement();
}
protected void writeTable(TableComponent table, ComponentKey componentKey,
final JRXmlWriter reportWriter) throws IOException
{
final JRXmlWriteHelper writer = reportWriter.getXmlWriteHelper();
XmlNamespace namespace = new XmlNamespace(
ComponentsExtensionsRegistryFactory.NAMESPACE,
componentKey.getNamespacePrefix(),
ComponentsExtensionsRegistryFactory.XSD_LOCATION);
writer.startElement("table", namespace);
reportWriter.writeDatasetRun(table.getDatasetRun());
ColumnVisitor<Void> columnWriter = new ColumnVisitor<Void>()
{
public Void visitColumn(Column column)
{
try
{
writer.startElement("column");
writer.addAttribute("width", column.getWidth());
writer.writeExpression(JRXmlConstants.ELEMENT_printWhenExpression,
JRXmlWriter.JASPERREPORTS_NAMESPACE,
column.getPrintWhenExpression(), false);
writeTableCell(column.getTableHeader(), "tableHeader", reportWriter);
writeTableCell(column.getTableFooter(), "tableFooter", reportWriter);
writeGroupCells(column.getGroupHeaders(), "groupHeader", reportWriter);
writeGroupCells(column.getGroupFooters(), "groupFooter", reportWriter);
writeTableCell(column.getColumnHeader(), "columnHeader", reportWriter);
writeTableCell(column.getColumnFooter(), "columnFooter", reportWriter);
writeTableCell(column.getDetailCell(), "detailCell", reportWriter);
writer.closeElement();
}
catch (IOException e)
{
throw new JRRuntimeException(e);
}
return null;
}
public Void visitColumnGroup(ColumnGroup columnGroup)
{
try
{
writer.startElement("columnGroup");
writer.addAttribute("width", columnGroup.getWidth());
writer.writeExpression(JRXmlConstants.ELEMENT_printWhenExpression,
JRXmlWriter.JASPERREPORTS_NAMESPACE,
columnGroup.getPrintWhenExpression(), false);
writeTableCell(columnGroup.getTableHeader(), "tableHeader", reportWriter);
writeTableCell(columnGroup.getTableFooter(), "tableFooter", reportWriter);
writeGroupCells(columnGroup.getGroupHeaders(), "groupHeader", reportWriter);
writeGroupCells(columnGroup.getGroupFooters(), "groupFooter", reportWriter);
writeTableCell(columnGroup.getColumnHeader(), "columnHeader", reportWriter);
writeTableCell(columnGroup.getColumnFooter(), "columnFooter", reportWriter);
// deep
for (BaseColumn column : columnGroup.getColumns())
{
column.visitColumn(this);
}
writer.closeElement();
}
catch (IOException e)
{
throw new JRRuntimeException(e);
}
return null;
}
};
for (BaseColumn column : table.getColumns())
{
column.visitColumn(columnWriter);
}
writer.closeElement();
}
protected void writeGroupCells(List<GroupCell> cells, String name,
JRXmlWriter reportWriter) throws IOException
{
if (cells != null)
{
JRXmlWriteHelper writer = reportWriter.getXmlWriteHelper();
for (GroupCell groupCell : cells)
{
writer.startElement(name);
writer.addAttribute("groupName", groupCell.getGroupName());
writeTableCell(groupCell.getCell(), "cell", reportWriter);
writer.closeElement();
}
}
}
protected void writeTableCell(Cell cell, String name,
JRXmlWriter reportWriter) throws IOException
{
if (cell != null)
{
JRXmlWriteHelper writer = reportWriter.getXmlWriteHelper();
writer.startElement(name);
reportWriter.writeStyleReferenceAttr(cell);
writer.addAttribute("height", cell.getHeight());
writer.addAttribute("rowSpan", cell.getRowSpan());
reportWriter.writeBox(cell.getLineBox(), JRXmlWriter.JASPERREPORTS_NAMESPACE);
reportWriter.writeChildElements(cell);
writer.closeElement();//cell
}
}
}