You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by joseph panico <jo...@panmachine.biz> on 2004/10/12 19:54:24 UTC

spindle warning-- Tapestry cannot see X at runtime.

Folks,

I running the latest Spindle (3.1.13) in Eclipse 3.0.0. 

For all of the Tapestry resources (.page, .jwc, etc) that are dirctly part of my
web application, Spindle produces a warning-- "Tapestry cannot see X at runtime".

All of these resources are under the Spindle "context", but they are not under
the WEB-INF dir in source form. A builder (ant) copies them under the WEB-INF at
build time. In source form, all of these resources live under the package
directory hierarchy along with the corresponding java class. For instance:

/org/pixory/pxapplication/pages/

     LoginPage.java
     LoginPage.html
     LoginPage.page


Any suggestions for how to make Spindle happy?

thanks,

joe


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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Geoff Longman <gl...@gmail.com>.
> I've tried the 1st and 2nd techniques that you described, but neither worked.
> I'm still getting "Tapestry cannot see X at runtime". Is there a way to debug
> further? (get some more visibility into what is happening under the covers)?

Looking at the first message in this thread.. this part confuses me..

> All of these resources are under the Spindle "context", but they are not under
> the WEB-INF dir in source form. A builder (ant) copies them under the WEB-INF at
> build time. In source form, all of these resources live under the package
> directory hierarchy along with the corresponding java class. For instance:
> 
> /org/pixory/pxapplication/pages/
> 
>      LoginPage.java
>      LoginPage.html
>      LoginPage.page

I don't understand what you are trying to do here. I'm assuming that
since you first built Pixory with Tapestry 2.X that all of your
application stuff is in the classpath right?

The two options I described are geared towards people like you. That
is, people who have developed applications in Tapestry 2.X where
everything sits in the classpath.

Here's a little cookbook on how I would start working your Tapestry
2.X app into Tapestry 3.0 using Spindle. The wizard doesn't help much
with this situation, in fact it just makes a big mess. It is possible
to create a project using the wizard and retrofit it but it's more
likely that you'll end up with a mess.

Before you start you need:

1. The old app with all the stuff in src folders
2. The web.xml file that you used to deploy your application under Tapestry 2.X

Step one: create an ordinary Java project and put your source folder (s) in it.
Add all the libraries your app needs ***But not the Tapestry libs! *****
Things won't compile yet 'cuz the jars needed by Tapestry are not in
the build path yet.

Step two: Fix the classpath. Open the Java Build Path property page
for your project and on the "libraries" tab, select "Add Library" and
choose "Tapestry Framework".

The project might compile now. It may not due to API or package naming
changes that occured between Tap 2.X and 3.0. You can fix them now if
you like but its not a precondition for the next step!

Your project layout now looks something like this:

MyProject
  /src
  Tapestry Framework (plugin defaults)
   JRE System Library

Now you need to add the web context folder so that we can add the
Tapestry project nature   to the project (ie make it "Spindlized").

Step 3: Add the folding folder structure to the project. These are
regular folders and not src folders/packages:  context/WEB-INF

New project layout:

MyProject
  /src
  Tapestry Framework (plugin defaults)
   JRE System Library
   /context
        /WEB-INF

Step 4: put web.xml in WEB-INF. Since we are talking about a Tapestry
2.X application, it is assumed that you subclasses ApplicationServlet,
overrode getApplicationSpecificationPath(), and your servlet is
properly configured in your web.xml

Optional Step: some people like to put a classes folder under WEB-INF
and make the change on the Java Build Path property page so compiled
classes end up there. It's up to you.

Step 5: Now we Spindlize the project. Right click on the project
folder choose Properties->Tapestry and make the project a Tapestry
project and select the folder "context" for the field Context Root.

That's it. When the project rebuilds, the Spindle builder will be
invoked, your web.xml parsed to find the classpath location of the
.application file, and all the pages/components in the project (that
Tapestry 3.0 can see) will be "visited" by the builder.

After that there are choices for you to consider:

1. Do you want to keep everything in the classpath or do you want to
move some all down into the Context Root?

2. You may want to update the DOCTYPE tags in your specs to point to
the Tapestry 3.0 DTD (this may cause things break as there are some
tag name changes).

3. If the only method you overrode in your ApplicationServlet subclass
was getApplicationSpecificationPath(), you could lose the subclass and
just change your web.xml from this:

 <servlet>
        <servlet-name>Pix</servlet-name>
        <servlet-class>com.mycorp.ApplicationServletSubclass</servlet-class>
    </servlet>

To this:

 <servlet>
        <servlet-name>Pix</servlet-name>
        <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
        <init-param>
        <param-name>org.apache.tapestry.application-specification</param-name>
        <param-value>/com/mycorp/Pix.application</param-value>
      </init-param>

    </servlet>

Plus many more. There are many roads you can take and there are
arguments for and against many of them.

But that's another story!

Geoff

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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Joe Panico <jo...@panmachine.biz>.
Geoff,

I've tried the 1st and 2nd techniques that you described, but neither worked.
I'm still getting "Tapestry cannot see X at runtime". Is there a way to debug
further? (get some more visibility into what is happening under the covers)?

thanks,

joe




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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Joe Panico <jo...@panmachine.biz>.
Geoff,

Thanks a bunch-- that's the bit I didn't understand. So the Spindle Builder
analyzes the build product of the regular Eclipse Java Builder, not the source
tree. I had the src and output folders misconfigured for the Java Builder, so
that it was not building a valid web app. I hadn't noticed previously because
I've used Ant for all my build/run needs.

Now Spindle is finding all the specifications properly and I'm enjoying the tool.

Keep up the great work!

regards,

joe


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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Geoff Longman <gl...@gmail.com>.
oops.. this bit:

"This is useful since the Spindle builder can check
 to see if the java builder aborted (most often due to classpath
 issues) and if it did the Spindle builder adds a marker to the project
 folder stating this fact and aborts." 

is in the wrong place. It should follow this bit:

" One last point, while the Spindle builder doesn't compile anything it
is invoked automatically and immediately after the ordinary java
project builder finishes. The java project builder of course compiles
 all the files in your project."

Geoff


On Wed, 13 Oct 2004 20:13:26 -0400, Geoff Longman <gl...@gmail.com> wrote:
> > Geoff,
> >
> > Excellent! That helps a lot. However, I am still confused about some basic
> > issues, and some of that confusion probably stems from the fact that I can't
> > find the Spindle help pages (they don't autoload in Eclipse for me).
> 
> Yes, that's an outstanding issue since the move to  Eclipse 3.0-
> haven't been able to figure out why the help plugin doesn't load.
> There wasn't much there except a link to this page:
> 
> http://tapestry.sourceforge.net/wiki/index.php/SpindleFeatureList
> 
> >
> > What exactly is the "Tapestry Project Builder" doing? It seems to be indexing
> > and validating all of the Tapestry resources that it can find. But does it also
> > compile, or copy/move any files?
> 
> Tapestry loads pages lazily on as as needed basis; validating each
> Page/Component as it loads and somtimes it coughs up the
> ExceptionPage. The builder is like a Tapestry runtime that perloads
> every page at once, building (internally) Spindle friendly versions of
> most of the same objects that Tapestry does. Runtime Tapestry will
> stop and show the ExceptionPage on the first error it finds during a
> page load; Spindle does not stop. Instead it adds a Marker to the file
> and keeps going.
> 
> Spindle can't catch everything 'cuz many errors depend on the runtime
> state of the application. Runtime state is not available to Spindle.
> But it does catch at least 50 common errors in the static specs and
> templates plus things like files that are in locations that Runtime
> Tapestry would not pick up.
> 
> As I said Spindle builds an internal representation of everthing that
> mirrors what Tapestry itself builds. But, that stuff is internal only,
> nothing is changed or moved in your project during a build. Perhaps
> the word "build" is a misnomer here but the Eclipse mechanism used to
> do all this is the project build mechanism and the Spindle builder
> class extends an Eclipse  class called IncrementalProjectBuilder. That
> internal rep is used by the "as you type" validation in the editors
> and also to come up with content completion suggestions.
> 
> One last point, while the Spindle builder doesn't compile anything it
> is invoked automatically and immediately after the ordinary java
> project builder finishes. The java project builder of course compiles
> all the files in your project.
> 
> >
> > Also, is the "Context Root", in the Tapestry pane of the project properties
> > sheet, the context in the src tree or the build tree (seems to be the src tree)?
> 
> Context root is outside of the classpath. It's a non source folder
> that would be the root of a WAR file. ie.
> 
> context       <------ !
>     /WEB-INF
>           web.xml
>          /lib
>          /classes
> 
> resource locations are resolved in tapestry either relative to the
> classpath or to the root of the WAR structure (the context root).
> 
> The easiest illustration is that context assets are resolved relative
> to the context root and private assests are resolved relative the
> classpath "root". This is useful since the Spindle builder can check
> to see if the java builder aborted (most often due to classpath
> issues) and if it did the Spindle builder adds a marker to the project
> folder stating this fact and aborts.
> 
> This context stuff wasn't needed in Spindle 1.X but because Tapestry
> 3.0 is very flexible in how it locates the .application file and many
> of the options are tied to entries in web.xml, Spindle parses web.xml
> as the first step in a full build.
> 
> I could go on and blabber about full vs incremental builds but I'll spare you.
> 
> Geoff
> 
> 
> 
> >
> > thanks for any tips.
> >
> > joe
> >
> > ---------------------------------------------------------------------
> > 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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Geoff Longman <gl...@gmail.com>.
> Geoff,
> 
> Excellent! That helps a lot. However, I am still confused about some basic
> issues, and some of that confusion probably stems from the fact that I can't
> find the Spindle help pages (they don't autoload in Eclipse for me).

Yes, that's an outstanding issue since the move to  Eclipse 3.0-
haven't been able to figure out why the help plugin doesn't load.
There wasn't much there except a link to this page:

http://tapestry.sourceforge.net/wiki/index.php/SpindleFeatureList

> 
> What exactly is the "Tapestry Project Builder" doing? It seems to be indexing
> and validating all of the Tapestry resources that it can find. But does it also
> compile, or copy/move any files?

Tapestry loads pages lazily on as as needed basis; validating each
Page/Component as it loads and somtimes it coughs up the
ExceptionPage. The builder is like a Tapestry runtime that perloads
every page at once, building (internally) Spindle friendly versions of
most of the same objects that Tapestry does. Runtime Tapestry will
stop and show the ExceptionPage on the first error it finds during a
page load; Spindle does not stop. Instead it adds a Marker to the file
and keeps going.

Spindle can't catch everything 'cuz many errors depend on the runtime
state of the application. Runtime state is not available to Spindle.
But it does catch at least 50 common errors in the static specs and
templates plus things like files that are in locations that Runtime
Tapestry would not pick up.

As I said Spindle builds an internal representation of everthing that
mirrors what Tapestry itself builds. But, that stuff is internal only,
nothing is changed or moved in your project during a build. Perhaps
the word "build" is a misnomer here but the Eclipse mechanism used to
do all this is the project build mechanism and the Spindle builder
class extends an Eclipse  class called IncrementalProjectBuilder. That
internal rep is used by the "as you type" validation in the editors
and also to come up with content completion suggestions.

One last point, while the Spindle builder doesn't compile anything it
is invoked automatically and immediately after the ordinary java
project builder finishes. The java project builder of course compiles
all the files in your project.

> 
> Also, is the "Context Root", in the Tapestry pane of the project properties
> sheet, the context in the src tree or the build tree (seems to be the src tree)?

Context root is outside of the classpath. It's a non source folder
that would be the root of a WAR file. ie.

context       <------ !
    /WEB-INF
          web.xml
         /lib
         /classes

resource locations are resolved in tapestry either relative to the
classpath or to the root of the WAR structure (the context root).

The easiest illustration is that context assets are resolved relative
to the context root and private assests are resolved relative the
classpath "root". This is useful since the Spindle builder can check
to see if the java builder aborted (most often due to classpath
issues) and if it did the Spindle builder adds a marker to the project
folder stating this fact and aborts.

This context stuff wasn't needed in Spindle 1.X but because Tapestry
3.0 is very flexible in how it locates the .application file and many
of the options are tied to entries in web.xml, Spindle parses web.xml
as the first step in a full build.

I could go on and blabber about full vs incremental builds but I'll spare you.

Geoff

> 
> thanks for any tips.
> 
> joe
> 
> ---------------------------------------------------------------------
> 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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Joe Panico <jo...@panmachine.biz>.
Geoff,

Excellent! That helps a lot. However, I am still confused about some basic
issues, and some of that confusion probably stems from the fact that I can't
find the Spindle help pages (they don't autoload in Eclipse for me).

What exactly is the "Tapestry Project Builder" doing? It seems to be indexing
and validating all of the Tapestry resources that it can find. But does it also
compile, or copy/move any files?

Also, is the "Context Root", in the Tapestry pane of the project properties
sheet, the context in the src tree or the build tree (seems to be the src tree)?

thanks for any tips.

joe



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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Geoff Longman <gl...@gmail.com>.
Joe, Tapestry 3.0 expects to find the .application specification
rooted under the web context and named the same as the <servlet-name>
tag (with some lookup options) except in two cases:

First case: you specify an <init-param> in web.xml (the key escapes me
right now). The value you set would be a path like the one you have.
This path is resolved in the classpath the same as Tapestry 2.X. This
allows you to have an app rooted the old way in the classpath without
resorting to the second case..

Second case you subclass ApplicationServlet and override
getApplicationSpecificationPath(). Works the same way as option 1; the
application file path is resolved in the classpath and not in the web
context.

If no application specification can be found, Tapestry creates a dummy
ApplicationSpec object that "resides" in WEB-INF and pages/components
will only be found that are located in the places allowed without
<page> and <component-alias> tags in the app spec.

Spindle is built to handle all the above cases with one proviso: The
subclass ApplicationServlet and override
getApplicationSpecificationPath(). Spindle can only deduce the path if
the source of the overrdden method looks the same as you did it:

 protected String getApplicationSpecificationPath()
       {
               return "/org/pixory/pxapplication/pxapplication.application";
       }
(no variables, just a string constant return value).


Clear as mud?

Geoff


On Tue, 12 Oct 2004 18:08:31 -0400, Geoff Longman <gl...@gmail.com> wrote:
> Aha!, If you override like that, Tapestry and Spindle look in the
> classpath, not the context.
> 
> I promise to give a better answer tomorrow. Right now I'm up against a dealine!
> 
> Geoff
> 
> 
> 
> On Tue, 12 Oct 2004 19:19:28 +0000 (UTC), joseph panico
> <jo...@panmachine.biz> wrote:
> > Geoff,
> >
> > I renamed the application specification to match the web.xml servlet-name, but
> > I'm still getting the same error. At runtime, my application is able to find the
> > application specification because my ApplicationServlet subclass overrides
> > getApplicationSpecificationPath() like this:
> >
> >         protected String getApplicationSpecificationPath()
> >         {
> >                 return "/org/pixory/pxapplication/pxapplication.application";
> >         }
> >
> > What strategy is Spindle using to find the app. specification? Is it looking in
> > the source tree, or is it looking in the Eclipse specified build tree?
> >
> >
> >
> > thanks,
> >
> > joe
> >
> > ---------------------------------------------------------------------
> > 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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Geoff Longman <gl...@gmail.com>.
Aha!, If you override like that, Tapestry and Spindle look in the
classpath, not the context.

I promise to give a better answer tomorrow. Right now I'm up against a dealine!

Geoff

On Tue, 12 Oct 2004 19:19:28 +0000 (UTC), joseph panico
<jo...@panmachine.biz> wrote:
> Geoff,
> 
> I renamed the application specification to match the web.xml servlet-name, but
> I'm still getting the same error. At runtime, my application is able to find the
> application specification because my ApplicationServlet subclass overrides
> getApplicationSpecificationPath() like this:
> 
>         protected String getApplicationSpecificationPath()
>         {
>                 return "/org/pixory/pxapplication/pxapplication.application";
>         }
> 
> What strategy is Spindle using to find the app. specification? Is it looking in
> the source tree, or is it looking in the Eclipse specified build tree?
> 
> 
> 
> thanks,
> 
> joe
> 
> ---------------------------------------------------------------------
> 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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by joseph panico <jo...@panmachine.biz>.
Geoff,

I renamed the application specification to match the web.xml servlet-name, but
I'm still getting the same error. At runtime, my application is able to find the
application specification because my ApplicationServlet subclass overrides
getApplicationSpecificationPath() like this:

	protected String getApplicationSpecificationPath()
	{
		return "/org/pixory/pxapplication/pxapplication.application";
	}

What strategy is Spindle using to find the app. specification? Is it looking in
the source tree, or is it looking in the Eclipse specified build tree?

thanks,

joe




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


Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Pablo Lalloni <pl...@afip.gov.ar>.
Hi Geoff,

I wonder how does Spindle finds out the correct <servlet/> from web.xml
'cause in our projects it doesn't work at all when we override
Tapestry's ApplicationServlet with our own implementation (actually in
all tapestry based webapps).

El mar, 12-10-2004 a las 15:04, Geoff Longman escribió:

> Hi Joe,
> 
> Correct me if I'm wrong, but it seems to me that maybe your
> application file is not being picked up by Spindle. The default is to
> use the same name as that used in <servlet-name> tag in web.xml. So
> <servlet-name>app</servlet> name would result in Spindle and Tapestry
> looking for "app.application". If that's not there Spindle (and
> Tapestry) creates a dummy application object. If this happens then
> your application file is never read and your stuff can't be found!
> 
> Geoff
> 
> 
> On Tue, 12 Oct 2004 17:54:24 +0000 (UTC), joseph panico
> <jo...@panmachine.biz> wrote:
> > Folks,
> > 
> > I running the latest Spindle (3.1.13) in Eclipse 3.0.0.
> > 
> > For all of the Tapestry resources (.page, .jwc, etc) that are dirctly part of my
> > web application, Spindle produces a warning-- "Tapestry cannot see X at runtime".
> > 
> > All of these resources are under the Spindle "context", but they are not under
> > the WEB-INF dir in source form. A builder (ant) copies them under the WEB-INF at
> > build time. In source form, all of these resources live under the package
> > directory hierarchy along with the corresponding java class. For instance:
> > 
> > /org/pixory/pxapplication/pages/
> > 
> >      LoginPage.java
> >      LoginPage.html
> >      LoginPage.page
> > 
> > Any suggestions for how to make Spindle happy?
> > 
> > thanks,
> > 
> > joe
> > 
> > ---------------------------------------------------------------------
> > 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

-- 

Pablo I. Lalloni 
Teléfono +54 (11) 4347-3177 
Proyecto Pampa
Dirección Informática Tributaria
AFIP

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I jumped into an IRC channel about Perl and started talking about driving
versus flying. If you know anything about Perl IRC channels, this quickly
escalated into a Holy War with Emacs users on one side and Jeep Wrangler
drivers on the other. It was hard to tell but I think Emacs came out as
the better utility vehicle.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Re: spindle warning-- Tapestry cannot see X at runtime.

Posted by Geoff Longman <gl...@gmail.com>.
Hi Joe,

Correct me if I'm wrong, but it seems to me that maybe your
application file is not being picked up by Spindle. The default is to
use the same name as that used in <servlet-name> tag in web.xml. So
<servlet-name>app</servlet> name would result in Spindle and Tapestry
looking for "app.application". If that's not there Spindle (and
Tapestry) creates a dummy application object. If this happens then
your application file is never read and your stuff can't be found!

Geoff


On Tue, 12 Oct 2004 17:54:24 +0000 (UTC), joseph panico
<jo...@panmachine.biz> wrote:
> Folks,
> 
> I running the latest Spindle (3.1.13) in Eclipse 3.0.0.
> 
> For all of the Tapestry resources (.page, .jwc, etc) that are dirctly part of my
> web application, Spindle produces a warning-- "Tapestry cannot see X at runtime".
> 
> All of these resources are under the Spindle "context", but they are not under
> the WEB-INF dir in source form. A builder (ant) copies them under the WEB-INF at
> build time. In source form, all of these resources live under the package
> directory hierarchy along with the corresponding java class. For instance:
> 
> /org/pixory/pxapplication/pages/
> 
>      LoginPage.java
>      LoginPage.html
>      LoginPage.page
> 
> Any suggestions for how to make Spindle happy?
> 
> thanks,
> 
> joe
> 
> ---------------------------------------------------------------------
> 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