Are these Tapestry 3 or 4? They seems to be Tapestry 3.
On 1/25/06, Patrick Casey <[EMAIL PROTECTED]> wrote: > > > 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:[EMAIL PROTECTED] > > 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 > > [EMAIL PROTECTED] > > > > -- > > http://www.fastmail.fm - Or how I learned to stop worrying and > > love email again > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > >