You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Barry Heath <ba...@sandiego.com> on 2006/06/07 06:07:08 UTC

RE: Wiring up an Export service

Patrick,

I've just been tasked with integrating BIRT into our Tapestry 3 application.
It appears as if you've done most of the heavly lifting already.

Would you be willing to share a little more detail about your integration.
I can roughly follow what you've outlined below, but it appears as if all of
the BIRT magic takes place in your ReportManager class.  Also, out of
curiousity, what are the issues you ran into with date parameters and BIRT?

Thank you for your time.


=========================
| Barry Heath
| sandiego.com
| (619) 220-8601
========================= 

-----Original Message-----
From: Patrick Casey [mailto:patcasey@adelphia.net] 
Sent: Wednesday, January 25, 2006 9:24 AM
To: 'Tapestry users'
Subject: RE: Wiring up an Export service


	Steve,

	Probably the easiest way to invoke a service is to link directly to
it rather than use a directlink, have the page listener fire, and then
invoke the service. So what I'd recommend is that you see if you can use the
existing ServiceLink component to invoke your service or, alternately, just
write your own "PDFLink" component.

	Here as a model is a service of mine that prints BIRT reports (I'm
not including all the dependencies but you an see the code flow). Also
attached is the ReportLink component that links to it.

	1: The report Link jwc and .html

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE component-specification PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
<!-- generated by Spindle, http://spindle.sourceforge.net -->

<component-specification class="components.ReportLink"
    allow-body="yes"
    allow-informal-parameters="yes">
    
    <description>add a description</description>
    <parameter name="reportName" required="yes" type="java.lang.String"
direction="in"/>
    <parameter name="keys" required="no" type="java.lang.String[]"
direction="in" />
    <parameter name="values" required="no" type="java.lang.String[]"
direction="in" />
    <parameter name="pdf" required="no" type="boolean" direction="in" />
</component-specification>

<span jwcid="@Any" element="a" href="ognl:getLink()">
	<span jwcid="@RenderBody" />
</span>

	2: The ReportLink .java (which constructs the link to the service)

package components;

import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.IEngineService;
import org.apache.tapestry.engine.ILink;

import services.ReportServer;

public abstract class ReportLink extends BaseComponent {	
	private String fReportName;
	private String fText;
	private boolean fPdf = false;
	private String[] fKeys;
	private String[] fValues;
			
	public boolean isPdf() {
		return fPdf;
	}

	public void setPdf(boolean pdf) {
		fPdf = pdf;
	}

	public String[] getKeys() {
		return fKeys;
	}

	public void setKeys(String[] keys) {
		fKeys = keys;
	}

	public String getReportName() {
		return fReportName;
	}

	public void setReportName(String reportName) {
		fReportName = reportName;
	}

	public String[] getValues() {
		return fValues;
	}

	public void setValues(String[] values) {
		fValues = values;
	}

	public String getLink() {
		IRequestCycle cycle = getPage().getRequestCycle();
		IEngineService service =
cycle.getEngine().getService(ReportServer.SERVICE_NAME);

		Object[] parms = new Object[4];
		parms[0] = fReportName;
		parms[1] = fKeys;
		parms[2] = fValues;
		parms[3] = fPdf;
		ILink link = service.getLink(cycle, this, parms);
		return link.getAbsoluteURL();
	}

	public String getText() {
		return fText;
	}

	public void setText(String text) {
		fText = text;
	}

}

	3: The Service Itself

package services;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;

import javax.servlet.ServletException;

import message.SystemMessage;
import navigation.Gallileo;

import org.apache.tapestry.IComponent;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.AbstractService;
import org.apache.tapestry.engine.IEngineServiceView;
import org.apache.tapestry.engine.ILink;
import org.apache.tapestry.request.ResponseOutputStream;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;

import presentation.Visit;

import reports.ReportManager;
import security.GateKeeper;
import servlet.MyServlet;
import utils.DateUtils;

public class ReportServer extends AbstractService {
	public static final String SERVICE_NAME = "ReportServer";
	private String FIRSTDOM = "$firstDOM";
	private String FIRSTDONM = "$firstDONM";
	private String FIRSTDOLM = "$firstDOLM";

	private Object processValue(String test) {
		if (test == null || !test.startsWith("$"))
			return test;
		// maybe
		if (FIRSTDOM.equals(test)) 
			return DateUtils.getFirstDayOfMonth(null);
		else if (FIRSTDONM.equals(test))
			return DateUtils.getFirstDayOfNextMonth(null);
		else if (FIRSTDOLM.equals(test))
			return DateUtils.getFirstDayOfLastMonth(null);
		else
			return test;
		
	}
	public ILink getLink(IRequestCycle cycle, IComponent component,
			Object[] parms) {
		String[] context;
		String pageName = component.getPage().getPageName();
		String idPath = component.getIdPath();
		context = new String[1];
		context[0] = pageName;
		return constructLink(cycle, SERVICE_NAME, context, parms,
true);
	}

	public void service(IEngineServiceView acrg0, IRequestCycle cycle,
			ResponseOutputStream response) throws
ServletException, IOException {
		Object[] parms = this.getParameters(cycle);
		String reportName = (String) parms[0];
		String[] keys = (String[]) parms[1];
		String[] values = (String[]) parms[2];
		boolean pdf = (Boolean) parms[3];
		HashMap params = new HashMap();
		int max = Math.min(keys.length, values.length);
		// check authorization...
		if (!GateKeeper.canViewReport(reportName)){
			Visit v = MyServlet.getVisit();
			String message =
SystemMessage.bindMessage("generic_not_authorized");
			v.getMessageQueue().addError(message);
			Gallileo.goHome(cycle);
			return;
		}
		for (int x = 0; x < max; x++) {
			String key = keys[x];
			String value = values[x];
			Object send = processValue(value);
			// big time bodge
			if (send instanceof Date) {
				send = DateUtils.renderBirtString((Date)
send);
			}
			params.put(key, send);
		}
		// now we render the report
		response.setContentType("text/html");
		String output;
		if (pdf) {
			response.setContentType("application/pdf");
	
cycle.getRequestContext().getResponse().setHeader("Pragma", "public");
	
cycle.getRequestContext().getResponse().setHeader("Cache-Control",
"max-age=0");
			output = HTMLRenderOption.OUTPUT_FORMAT_PDF;
		} else
			output = HTMLRenderOption.OUTPUT_FORMAT_HTML;
		ReportManager.runReport(reportName, params, response,
output);

	}

	public String getName() {

		return SERVICE_NAME;
	}

}

> -----Original Message-----
> From: Steve Wells [mailto:websystems@ownmail.net]
> Sent: Wednesday, January 25, 2006 1:04 AM
> To: tapestry-user@jakarta.apache.org
> Subject: Wiring up an Export service
> 
> Like many folks I have a requirement to stream out reports (or whatever)
> in various formats eg pdf, xls
> 
> Following some threads here I've started writing a Service to handle
> this but am having trouble wiring it into my pages (some basic Tap
> knowledge is eluding me here)
> 
> The basic flow is:
> ReportCriteria page to collect parameters eg. date range, export format
> Form submit listener calls ReportResult page to get the report data and
> spit out to user in selected format...
>   ...OR should the listener call the service, if so how?
> 
> Any more detailed code examples or tips would be fantastic.  I'm
> starting to feel a bit dumb right now as I can't see how a page talks to
> a service.
> 
> Thanks...
> --
>   Steve Wells
>   websystems@ownmail.net
> 
> --
> http://www.fastmail.fm - Or how I learned to stop worrying and
>                           love email again
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org