Code Search for Developers
 
 
  

Jrxml2Rom.java from BIRT at Krugle


Show Jrxml2Rom.java syntax highlighted

/*
 * Created on Jan 17, 2005
 */

package com.eclipse.birt.converters.jasper;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;

import net.sf.jasperreports.engine.JRBand;
import net.sf.jasperreports.engine.JRElement;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRGroup;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRQuery;
import net.sf.jasperreports.engine.design.JRDesignEllipse;
import net.sf.jasperreports.engine.design.JRDesignImage;
import net.sf.jasperreports.engine.design.JRDesignLine;
import net.sf.jasperreports.engine.design.JRDesignRectangle;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;

import org.eclipse.birt.report.model.api.CellHandle;
import org.eclipse.birt.report.model.api.DataItemHandle;
import org.eclipse.birt.report.model.api.DataSetHandle;
import org.eclipse.birt.report.model.api.DesignEngine;
import org.eclipse.birt.report.model.api.FreeFormHandle;
import org.eclipse.birt.report.model.api.LabelHandle;
import org.eclipse.birt.report.model.api.ListGroupHandle;
import org.eclipse.birt.report.model.api.ListHandle;
import org.eclipse.birt.report.model.api.OdaDataSetHandle;
import org.eclipse.birt.report.model.api.ReportDesignHandle;
import org.eclipse.birt.report.model.api.ReportItemHandle;
import org.eclipse.birt.report.model.api.RowHandle;
import org.eclipse.birt.report.model.api.ScalarParameterHandle;
import org.eclipse.birt.report.model.api.SessionHandle;
import org.eclipse.birt.report.model.api.SlotHandle;
import org.eclipse.birt.report.model.api.TableGroupHandle;
import org.eclipse.birt.report.model.api.TableHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.elements.Cell;
import org.eclipse.birt.report.model.elements.DataItem;
import org.eclipse.birt.report.model.elements.FreeForm;
import org.eclipse.birt.report.model.elements.Label;
import org.eclipse.birt.report.model.elements.ListGroup;
import org.eclipse.birt.report.model.elements.ListItem;
import org.eclipse.birt.report.model.elements.OdaDataSet;
import org.eclipse.birt.report.model.elements.ReportDesign;
import org.eclipse.birt.report.model.elements.ScalarParameter;
import org.eclipse.birt.report.model.elements.TableColumn;
import org.eclipse.birt.report.model.elements.TableGroup;
import org.eclipse.birt.report.model.elements.TableItem;
import org.eclipse.birt.report.model.elements.TableRow;

/**
 * @author Steve
 */
public class Jrxml2Rom
{
	private final JasperDesign jasperDesign;
	private ReportDesignHandle designHandle = null;
	private boolean generateFreeForm = false;

	private Jrxml2Rom(String jrxmlFileName) throws ConvertException
	{
		File sourceFile = new File(jrxmlFileName);
		try
		{
			jasperDesign = JRXmlLoader.load(sourceFile);
		}
		catch (Exception e)
		{
			throw new ConvertException("Unable to parse jrxml file", e);
		}
	}

	public void createROM(String romFileName) throws ConvertException
	{
		try
		{
			SessionHandle session = DesignEngine.newSession(null);
			designHandle = session.createDesign();
			addParameters();
			DataSetHandle dataSetHandle = addDataSet();
			addBody(dataSetHandle);
			SlotHandle componentSlot = designHandle.getComponents();
			SlotHandle dataSourceSlot = designHandle.getDataSources();
			SlotHandle masterPageSlot = designHandle.getMasterPages();
			SlotHandle styleSlot = designHandle.getStyles();
			designHandle.saveAs(romFileName);
		}
		catch (Exception e)
		{
			throw new ConvertException("Unable to create ROM", e);
		}
	}

	private void addBody(DataSetHandle dataSetHandle) throws SemanticException
	{
		SlotHandle slot = designHandle.getBody();
		ReportDesign design = designHandle.getDesign();
		JRBand jrBackgroundBand = jasperDesign.getBackground();
		JRBand jrColumnFooterBand = jasperDesign.getColumnFooter();
		JRBand jrColumnHeaderBand = jasperDesign.getColumnHeader();
		if (generateFreeForm)
		{
			ListItem list = new ListItem();
			ListHandle listHandle = new ListHandle(design, list);
			listHandle.setDataSet(dataSetHandle);
			addPageHeader(listHandle);
			addPageFooter(listHandle);
			addTitle(listHandle);
			addSummary(listHandle);
			addGroups(listHandle);
			addDetail(listHandle);
			slot.add(list);
		}
		else
		{
			TableItem table = new TableItem();
			TableHandle tableHandle = new TableHandle(design, table);
			// TODO sort elements by X position
			tableHandle.setDataSet(dataSetHandle);
			addColumns(tableHandle);
			addPageHeader(tableHandle);
			addPageFooter(tableHandle);
			addTitle(tableHandle);
			addSummary(tableHandle);
			addGroups(tableHandle);
			addDetail(tableHandle);
			slot.add(table);
			/*
			 * for (int i = 0; i < jrElements.length; i++) { TableColumn column =
			 * new TableColumn(); columnsSlot.add(column); }
			 * addDetail(tableHandle.getDetail());
			 */
		}
	}

	private void addPageHeader(ListHandle listHandle)
	{
		JRBand jrPageHeaderBand = jasperDesign.getPageHeader();
		// TODO finish
	}

	private void addPageHeader(TableHandle tableHandle)
	{
		JRBand jrPageHeaderBand = jasperDesign.getPageHeader();
		// TODO finish
	}

	private void addPageFooter(ListHandle listHandle)
	{
		JRBand jrPageFooterBand = jasperDesign.getPageFooter();
		// TODO finish
	}

	private void addPageFooter(TableHandle tableHandle)
	{
		JRBand jrPageFooterBand = jasperDesign.getPageFooter();
		// TODO finish
	}

	private void addTitle(ListHandle listHandle) throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		SlotHandle headerSlot = listHandle.getHeader();
		FreeForm freeForm = new FreeForm();
		FreeFormHandle freeFormHandle = new FreeFormHandle(design, freeForm);
		addListElements(
			jasperDesign.getTitle(),
			freeFormHandle.getReportItems());
		headerSlot.add(freeForm);
	}

	private void addTitle(TableHandle tableHandle) throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		SlotHandle headerSlot = tableHandle.getHeader();
		TableRow row = new TableRow();
		RowHandle rowHandle = new RowHandle(design, row);
		addTableElements(jasperDesign.getTitle(), rowHandle.getCells());
		headerSlot.add(row);
	}

	private void addSummary(ListHandle listHandle) throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		SlotHandle footerSlot = listHandle.getFooter();
		FreeForm freeForm = new FreeForm();
		FreeFormHandle freeFormHandle = new FreeFormHandle(design, freeForm);
		addListElements(
			jasperDesign.getSummary(),
			freeFormHandle.getReportItems());
		footerSlot.add(freeForm);
	}

	private void addSummary(TableHandle tableHandle) throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		SlotHandle footerSlot = tableHandle.getFooter();
		TableRow row = new TableRow();
		RowHandle rowHandle = new RowHandle(design, row);
		addTableElements(jasperDesign.getSummary(), rowHandle.getCells());
		footerSlot.add(row);
	}

	private void addGroups(ListHandle listHandle) throws SemanticException
	{
		JRGroup[] jrGroups = jasperDesign.getGroups();
		SlotHandle slot = listHandle.getGroups();
		for (int i = 0; i < jrGroups.length; i++)
			addListGroup(jrGroups[i], slot);
	}

	private void addListGroup(JRGroup jrGroup, SlotHandle slot)
		throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		ListGroup group = new ListGroup();
		ListGroupHandle groupHandle = new ListGroupHandle(design, group);
		SlotHandle headerSlot = groupHandle.getHeader();
		FreeForm headerFreeForm = new FreeForm();
		headerSlot.add(headerFreeForm);
		FreeFormHandle headerFreeFormHandle = new FreeFormHandle(design,
			headerFreeForm);
		addTableElements(
			jrGroup.getGroupHeader(),
			headerFreeFormHandle.getReportItems());
		SlotHandle footerSlot = groupHandle.getFooter();
		FreeForm footerFreeForm = new FreeForm();
		footerSlot.add(footerFreeForm);
		FreeFormHandle footerFreeFormHandle = new FreeFormHandle(design,
			footerFreeForm);
		addTableElements(
			jrGroup.getGroupFooter(),
			footerFreeFormHandle.getReportItems());
		slot.add(group);
	}

	private void addGroups(TableHandle tableHandle) throws SemanticException
	{
		JRGroup[] jrGroups = jasperDesign.getGroups();
		SlotHandle slot = tableHandle.getGroups();
		for (int i = 0; i < jrGroups.length; i++)
			addTableGroup(jrGroups[i], slot);
	}

	private void addTableGroup(JRGroup jrGroup, SlotHandle slot)
		throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		TableGroup group = new TableGroup();
		TableGroupHandle groupHandle = new TableGroupHandle(design, group);
		SlotHandle headerSlot = groupHandle.getHeader();
		TableRow headerRow = new TableRow();
		headerSlot.add(headerRow);
		RowHandle headerRowHandle = new RowHandle(design, headerRow);
		addTableElements(jrGroup.getGroupHeader(), headerRowHandle.getCells());
		SlotHandle footerSlot = groupHandle.getFooter();
		TableRow footerRow = new TableRow();
		footerSlot.add(footerRow);
		RowHandle footerRowHandle = new RowHandle(design, footerRow);
		addTableElements(jrGroup.getGroupFooter(), footerRowHandle.getCells());
		slot.add(group);
	}

	private void addDetail(ListHandle listHandle) throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		SlotHandle detailSlot = listHandle.getDetail();
		FreeForm freeForm = new FreeForm();
		FreeFormHandle freeFormHandle = new FreeFormHandle(design, freeForm);
		addListElements(
			jasperDesign.getDetail(),
			freeFormHandle.getReportItems());
		detailSlot.add(freeForm);
	}

	private void addColumns(TableHandle tableHandle) throws SemanticException
	{
		JRBand jrDetailBand = jasperDesign.getDetail();
		JRElement[] jrElements = jrDetailBand.getElements();
		SlotHandle slot = tableHandle.getColumns();
		for (int i = 0; i < jrElements.length; i++)
		{
			TableColumn column = new TableColumn();
			slot.add(column);
		}
	}

	private void addDetail(TableHandle tableHandle) throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		SlotHandle detailSlot = tableHandle.getDetail();
		TableRow row = new TableRow();
		RowHandle rowHandle = new RowHandle(design, row);
		addTableElements(jasperDesign.getDetail(), rowHandle.getCells());
		detailSlot.add(row);
	}

	private JRElement[] sortJrElements(JRElement[] jrElements)
	{
		ArrayList list = new ArrayList();
		for (int i = 0; i < jrElements.length; i++)
			list.add(jrElements[i]);
		Collections.sort(list, new JrElementComparator());
		JRElement[] result = new JRElement[list.size()];
		for (int i = 0; i < list.size(); i++)
			result[i] = (JRElement) list.get(i);
		return result;
	}

	private static class JrElementComparator implements Comparator
	{
		public int compare(Object arg0, Object arg1)
		{
			if (arg0 instanceof JRElement && arg1 instanceof JRElement)
			{
				JRElement e0 = (JRElement) arg0;
				JRElement e1 = (JRElement) arg1;
				int i0 = e0.getX();
				int i1 = e1.getX();
				if (i0 > i1)
					return 1;
				if (i0 < i1)
					return -1;
			}
			return 0;
		}
	}

	private void addListElements(JRBand jrBand, SlotHandle slot)
		throws SemanticException
	{
		addListElements(jrBand.getElements(), slot);
	}

	private void addTableElements(JRBand jrBand, SlotHandle slot)
		throws SemanticException
	{
		addTableElements(sortJrElements(jrBand.getElements()), slot);
	}

	private void addListElements(JRElement[] jrElements, SlotHandle slot)
		throws SemanticException
	{
		for (int i = 0; i < jrElements.length; i++)
			addElement(jrElements[i], slot);
	}

	private void addTableElements(JRElement[] jrElements, SlotHandle slot)
		throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		for (int i = 0; i < jrElements.length; i++)
		{
			Cell cell = new Cell();
			CellHandle cellHandle = new CellHandle(design, cell);
			SlotHandle contentSlot = cellHandle.getContent();
			addElement(jrElements[i], contentSlot);
			slot.add(cell);
		}
	}

	private void addElement(JRElement jrElement, SlotHandle slot)
		throws SemanticException
	{
		ReportDesign design = designHandle.getDesign();
		ReportItemHandle reportItemHandle = null;
		if (jrElement instanceof JRDesignRectangle)
		{
		}
		else if (jrElement instanceof JRDesignEllipse)
		{
		}
		else if (jrElement instanceof JRDesignImage)
		{
		}
		else if (jrElement instanceof JRDesignLine)
		{
		}
		else if (jrElement instanceof JRDesignStaticText)
		{
			JRDesignStaticText jrDesignStaticText = (JRDesignStaticText) jrElement;
			String text = jrDesignStaticText.getText();
			Label label = new Label();
			LabelHandle labelHandle = new LabelHandle(design, label);
			reportItemHandle = labelHandle;
			labelHandle.setText(text);
			slot.add(label);
		}
		else if (jrElement instanceof JRDesignTextField)
		{
			JRDesignTextField jrDesignTextField = (JRDesignTextField) jrElement;
			JRExpression jrExpression = jrDesignTextField.getExpression();
			String romScript = jasperExpr2RomScript(jrExpression.getText());
			DataItem dataItem = new DataItem();
			DataItemHandle dataHandle = new DataItemHandle(design, dataItem);
			reportItemHandle = dataHandle;
			dataHandle.setValueExpr(romScript);
			slot.add(dataItem);
		}
		if (reportItemHandle != null)
		{
			reportItemHandle.setX(jrElement.getX() + "px");
			reportItemHandle.setY(jrElement.getY() + "px");
			reportItemHandle.setWidth(jrElement.getWidth() + "px");
			reportItemHandle.setHeight(jrElement.getHeight() + "px");
		}
	}

	private DataSetHandle addDataSet() throws Exception
	{
		SlotHandle slot = designHandle.getDataSets();
		ReportDesign design = designHandle.getDesign();
		JRQuery jrQuery = jasperDesign.getQuery();
		String queryText = jrQuery.getText();
		OdaDataSetHandle handle = null;
		if (queryText != null && queryText.length() > 0)
		{
			OdaDataSet dataSet = new OdaDataSet();
			handle = new OdaDataSetHandle(design, dataSet);
			handle.setProperty("name", "jdbc");
			handle.setProperty("queryType", "JdbcSelectDataSet");
			slot.add(dataSet);
			String queryScript = jasperString2RomScript(queryText);
			handle.setProperty("queryScript", queryScript);
		}
		return handle;
	}

	private String jasperExpr2RomScript(String source)
	{
		// TODO - handle java expessions
		source = source.replaceAll("'", "\\'");
		ArrayList partList = new ArrayList();
		int dollarLoc = source.indexOf("$");
		int startLoc = 0;
		while (dollarLoc >= 0)
		{
			String part = source.substring(startLoc, dollarLoc);
			partList.add(part);
			startLoc = dollarLoc + 1;
			if (dollarLoc == 0 || source.charAt(startLoc - 1) != '\\')
			{
				int keyLoc = startLoc;
				while (keyLoc < source.length() && source.charAt(keyLoc) == ' ')
					keyLoc++;
				if (keyLoc < source.length())
				{
					char subsType;
					switch (source.charAt(keyLoc))
					{
					case 'P' :
					case 'p' :
						subsType = 'P';
						break;
					case 'V' :
					case 'v' :
						subsType = 'V';
						break;
					case 'F' :
					case 'f' :
						subsType = 'F';
						break;
					default :
						subsType = '?';
					}
					if (subsType != '?')
					{
						int beginBracketLoc = keyLoc + 1;
						while (beginBracketLoc < source.length()
							&& source.charAt(beginBracketLoc) == ' ')
							beginBracketLoc++;
						if (beginBracketLoc < source.length())
						{
							if (source.charAt(beginBracketLoc) == '{')
							{
								beginBracketLoc += 1;
								int endBracketLoc = source.indexOf(
									'}',
									beginBracketLoc);
								if (endBracketLoc >= beginBracketLoc)
								{
									String identifier = source.substring(
										beginBracketLoc,
										endBracketLoc);
									switch (subsType)
									{
									case 'P' :
										partList.add("report.params['"
											+ identifier + "']");
										break;
									case 'V' :
										partList.add(identifier);
										break;
									case 'F' :
										partList.add("row['" + identifier
											+ "']");
										break;
									}
									startLoc = endBracketLoc + 1;
								}
							}
						}
					}
				}
			}
			dollarLoc = source.indexOf("$", startLoc);
		}
		String part = source.substring(startLoc);
		partList.add(part);
		StringBuffer buf = new StringBuffer();
		Iterator iterator = partList.iterator();
		while (iterator.hasNext())
		{
			part = (String) iterator.next();
			buf.append(part);
		}
		return buf.toString();
	}

	private String jasperString2RomScript(String source)
	{
		source = source.replaceAll("'", "\\'");
		ExprPartList partList = new ExprPartList();
		int dollarLoc = source.indexOf("$");
		int startLoc = 0;
		while (dollarLoc >= 0)
		{
			String part = source.substring(startLoc, dollarLoc);
			partList.addLiteral(part);
			startLoc = dollarLoc + 1;
			if (dollarLoc == 0 || source.charAt(startLoc - 1) != '\\')
			{
				int keyLoc = startLoc;
				while (keyLoc < source.length() && source.charAt(keyLoc) == ' ')
					keyLoc++;
				if (keyLoc < source.length())
				{
					char subsType;
					switch (source.charAt(keyLoc))
					{
					case 'P' :
					case 'p' :
						subsType = 'P';
						break;
					case 'V' :
					case 'v' :
						subsType = 'V';
						break;
					case 'F' :
					case 'f' :
						subsType = 'F';
						break;
					default :
						subsType = '?';
					}
					if (subsType != '?')
					{
						int beginBracketLoc = keyLoc + 1;
						while (beginBracketLoc < source.length()
							&& source.charAt(beginBracketLoc) == ' ')
							beginBracketLoc++;
						if (beginBracketLoc < source.length())
						{
							if (source.charAt(beginBracketLoc) == '{')
							{
								beginBracketLoc += 1;
								int endBracketLoc = source.indexOf(
									'}',
									beginBracketLoc);
								if (endBracketLoc >= beginBracketLoc)
								{
									String identifier = source.substring(
										beginBracketLoc,
										endBracketLoc);
									switch (subsType)
									{
									case 'P' :
										partList.addExpression("report.params['"
											+ identifier + "']");
										break;
									case 'V' :
										partList.addExpression(identifier);
										break;
									case 'F' :
										partList.addExpression("row['"
											+ identifier + "']");
										break;
									}
									startLoc = endBracketLoc + 1;
								}
							}
						}
					}
				}
			}
			dollarLoc = source.indexOf("$", startLoc);
		}
		String part = source.substring(startLoc);
		partList.addLiteral(part);
		return partList.toString();
	}

	private static class ExprPart
	{
		public final boolean literal;
		public String part;

		public ExprPart(boolean literal, String part)
		{
			this.literal = literal;
			this.part = part;
		}
	}

	private static class ExprPartList
	{
		public final ArrayList list = new ArrayList();

		public void addLiteral(String part)
		{
			int size = list.size();
			ExprPart lastExprPart = size == 0
				? null
				: (ExprPart) list.get(size - 1);
			if (lastExprPart != null && lastExprPart.literal)
				lastExprPart.part += part;
			else
			{
				lastExprPart = new ExprPart(true, part);
				list.add(lastExprPart);
			}
		}

		public void addExpression(String part)
		{
			ExprPart exprPart = new ExprPart(false, part);
			list.add(exprPart);
		}

		public String toString()
		{
			StringBuffer buf = new StringBuffer();
			String sep = "";
			Iterator iterator = list.iterator();
			while (iterator.hasNext())
			{
				ExprPart exprPart = (ExprPart) iterator.next();
				if (exprPart.part.length() > 0)
				{
					buf.append(sep);
					sep = "+";
					if (exprPart.literal)
						buf.append("'");
					buf.append(exprPart.part);
					if (exprPart.literal)
						buf.append("'");
				}
			}
			return buf.toString();
		}
	}

	private void addParameters() throws Exception
	{
		SlotHandle slot = designHandle.getParameters();
		ReportDesign design = designHandle.getDesign();
		JRParameter[] jrParameters = jasperDesign.getParameters();
		for (int i = 0; i < jrParameters.length; i++)
		{
			JRParameter jrParameter = jrParameters[i];
			String name = jrParameter.getName();
			JRExpression defaultValueExpr = jrParameter.getDefaultValueExpression();
			String description = jrParameter.getDescription();
			String valueClassName = jrParameter.getValueClassName();
			String jrDataType = null;
			if ("java.lang.String".equals(valueClassName))
				jrDataType = "string";
			else if ("java.lang.Integer".equals(valueClassName))
				jrDataType = "decimal";
			if (jrDataType != null)
			{
				ScalarParameter param = new ScalarParameter();
				ScalarParameterHandle handle = new ScalarParameterHandle(
					design, param);
				handle.setProperty("name", name);
				handle.setProperty("dataType", "string");
				handle.setProperty("displayName", description);
				slot.add(param);
			}
		}
	}

	public static class ConvertException extends Exception
	{
		private static final long serialVersionUID = 3257284712639640887L;

		public ConvertException()
		{
			super();
		}

		public ConvertException(String arg0)
		{
			super(arg0);
		}

		public ConvertException(String arg0, Throwable arg1)
		{
			super(arg0, arg1);
		}

		public ConvertException(Throwable arg0)
		{
			super(arg0);
		}
	}

	public static void main(String args[])
	{
		if (args.length < 1)
		{
			showUsage();
			return;
		}
		String jrxmlFileName = args[0];
		String romFileName;
		if (args.length == 1)
		{
			romFileName = jrxmlFileName;
			int i = romFileName.lastIndexOf(".");
			if (i >= 0)
				romFileName = romFileName.substring(0, i);
			romFileName += ".rom.xml";
		}
		else if (args.length == 2)
			romFileName = args[1];
		else
		{
			showUsage();
			return;
		}
		System.out.println("jrxml file name = " + jrxmlFileName);
		System.out.println("ROM file name = " + romFileName);
		Jrxml2Rom converter;
		try
		{
			converter = new Jrxml2Rom(jrxmlFileName);
		}
		catch (Exception e)
		{
			System.out.println("Unable to parse jrxml: " + e);
			return;
		}
		try
		{
			converter.createROM(romFileName);
		}
		catch (Exception e)
		{
			System.out.println("Unable to create ROM: " + e);
			return;
		}
	}

	public static void showUsage()
	{
		System.out.println("Usage:");
		System.out.println("  Jrxml2Rom <jrxmlFileName> [<romFileName>]");
	}

	public final boolean isGenerateFreeForm()
	{
		return generateFreeForm;
	}

	public final void setGenerateFreeForm(boolean generateFreeForm)
	{
		this.generateFreeForm = generateFreeForm;
	}
}




See more files for this project here

BIRT

BIRT is an open source, Eclipse-based reporting system that integrates with your application to produce compelling reports for both web and PDF.

Project homepage: http://www.eclipse.org/birt/phoenix/
Programming language(s): Java,XML
License: gpl2

  Jrxml2Rom.java