Thanks all for a overwhelming and generous set of responses.

I've not long had a chance to get back to this but still fail to see
what benefit a service gives me for this problem.  My first effort,
before reading how many folks think a service is the way to go, was
basically as follows:
1. ReportCriteria page will collect from the user report parameters, eg
date ranges, export type etc etc
2. Submit listener is activated and wires up the report params in a
ReportResults page and returns report result page 
3. ReportResult page is called.  It calls the report (Jasper or
whatever), gets the result and streams content out to the user.

It seems a reasonable way to do things?

Using a service there are some confusioning elements:
1. How to call a service from a listener?  Yes I could call the service
getlink() and return that (error for me) or other ways outlined here (I
tryed and had problems)
2. How to pass a number of arbitrary params to service, ie. Report
params for different reports ?

On top of that it is difficult to code up a service, its seems like
Tapestry under the hood kind of stuff...stuff unless there is a clear
benefit must be a good place to stay away from, for relative noobs
anyway ;)

There are many things I tried and didn't work easily, based on your kind
posts, other posts and Tapestry source...I guess I could have persisted
longer but when I compare coding a service to implementation without a
service it seems a no-brainer...a service - in this case - complicates
things.  I just fail to see the benefits.  

Save me! :)

On Thu, 26 Jan 2006 13:28:56 +0300, "Dmitry Gusev"
<[EMAIL PROTECTED]> said:
> I have created a component and a service like that, you can found them at
> here (sorry no SVN yet) :
> 
> http://keyintegrity.com/download/servicehub-src-beta-2.tar.tar.gz<http://keyintegrity.com/download/servicehub-src-beta-1.0.tar.gz>
> 
> JavaSource/org/keyintegrity/servicehub/csulengine/components/JasperReport.jwc
> :
> --------------------------------
> 
> *<?xml* version="1.0" encoding="UTF-8"*?>**<!-- **   Copyright 2005
> The Key Integrity.*
> *   Licensed under the Apache License, Version 2.0 (the "License");** 
>  you may not use this file except in compliance with the License.**  
> You may obtain a copy of the License at*
> *       http://www.apache.org/licenses/LICENSE-2.0*
> *   Unless required by applicable law or agreed to in writing,
> software**   distributed under the License is distributed on an "AS
> IS" BASIS,**   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
> express or implied.**   See the License for the specific language
> governing permissions and**   limitations under the License.**-->*
> *<!DOCTYPE *component-specification PUBLIC
>   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
>   
> "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"*>**<component-specification*
> class="org.keyintegrity.servicehub.csulengine.components.JasperReport"
>    allow-body="no" allow-informal-parameters=
> "no"*>*
> 
>    *<description>*
>       JasperReports
>    *</description>*
> 
>    *<property* name="jasperPrint"*/>*
> 
>    *<parameter* name="compiledDesign"*>*
>        *<description>*
>            A path to compiled report design file (*.jasper).
>            One of compiledDesign or reportDesign parameters must be
>            provided.
>            If both then reportDesign is ignored.
>        *</description>*
>    *</parameter>*
> 
>    *<parameter* name="reportDesign"*>*
>        *<description>*
>            A path to jasper report design file (*.jrxml).
>            One of compiledDesign or reportDesign parameters must be
>            provided.
>            If both then reportDesign is ignored.
>        *</description>*
>    *</parameter>***
> 
>    *<parameter* name="scope" default-value="literal:session"*>*
>        *<description>*
>            Defines the report scope (the availability of the report
> resources like images etc.).
>            May be "shared" - shared between different sessions or
>            "session".
>        *</description>*
>    *</parameter>*
> 
>    *<parameter* name="reportName" default-value="literal:report"*/>*
> 
>    *<parameter* name="reportParameters"*/>*
> 
>    *<parameter* name="dataSourceProvider"*>*
>        *<description>*
>            JRDataSourceProvider
>        *</description>*
>    *</parameter>*
> 
>    *<inject* property="resourceService"
> object="service:servicehub.csulengine.services.Resource"*/>*
>    *<inject* property="sharedResourceProvider" type="state"
> object="shared-resource-provider"*/>*
>    *<inject* property="sessionResourceProvider" type="state"
> object="session-resource-provider"*/>*
>   *</component-specification>*
> 
> -----------------------------------------------
> 
> This component works with Jasperreports, it's sample output is here :
> http://keyintegrity.com/files/jasperreport.gif
> 
> It uses so called Resource service that allows to provide secure access
> to
> IWebResource via URL using ResourceProviders.
> 
> -----------------------------
> package org.keyintegrity.servicehub.csulengine.services;
> 
> /**
>  * A type of [EMAIL PROTECTED]
> org.keyintegrity.servicehub.csulengine.services.IResource} that may be
> accessed over
>  * [EMAIL PROTECTED]
>  org.keyintegrity.servicehub.csulengine.services.ResourceService}
>  *
>  * @author Dmitry I. Gusev <[EMAIL PROTECTED]>
>  *
>  */
> public interface IWebResource extends IResource {
>     /**
>      * Mime type of resource data. May be null.
>      */
>     public String getContentType();
>     /**
>      * Resource data.
>      */
>     public byte[] getData();
> }
> --------------------------------
> 
> 
> Here is an example of placing a report to your page:
> 
> ------------------------------------------
> 
> *<page* jwcid="@Csul:page" type="home" description="JasperReports Tag
> Example"*>*
>    *<section* jwcid="@Csul:section" name="JasperReport Overview"*>*
>        *<JasperReport* jwcid="@Csul:JasperReport"
>            reportDesign="/jasperreports/report.jrxml"
>            reportParameters="ognl:reportParameters"
>                  dataSourceProvider="ognl:dataSourceProvider"
>        */>*
> 
>    *</section>*
> *</page>
> *
> 
> ------------------------------------------
> 
> You can find more information in the sources (there are a module with the
> reporting example : WebContent/WEB-INF/modules/reporting/).
> 
> 
> 2006/1/26, Patrick Casey <[EMAIL PROTECTED]>:
> >
> >
> >         They are; I should have mentioned that. I'm likely to still be on
> > 3.0 for at least the next few months.
> >
> >         --- Pat
> >
> > > -----Original Message-----
> > > From: Cliff Zhao [mailto: [EMAIL PROTECTED]
> > > Sent: Wednesday, January 25, 2006 1:22 PM
> > > To: Tapestry users
> > > Subject: Re: Wiring up an Export service
> > >
> > > 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]
> > > >
> > > >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
-- 
  Steve Wells
  [EMAIL PROTECTED]

-- 
http://www.fastmail.fm - IMAP accessible web-mail


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to