Hello,

 

            I'm trying to write a new Foreach component that allows you to
safely add/remove entries from the provided list of objects during the
rewind cycle (to make it easier to create pages such as the todo listing
show in "Tapestry in Action"). I do this by caching the list during the
render cycle so that the same elements will be used during rewind. I got it
to work fine when it appears only once in a page, however, In order to make
this work with when it appears more than once in a page or nested inside
another Foreach component, I found that had to extend AbstractFormComponent
instead of BaseComponent, since I can then obtain a unique ID for each
occurrence. Once I did that, I started to get this exception:

 

org.apache.tapestry.ApplicationRuntimeException

Method 'public abstract java.lang.String
org.apache.tapestry.form.AbstractFormComponent.getName()' (declared in class
org.apache.tapestry.form.AbstractFormComponent) has no implementation in
class app.internal.component.form.SafeForeach (or enhanced subclass
app.internal.component.form.SafeForeach$Enhance_73).

 

If I create do-nothing get/setName methods, Tapestry is satisfied and starts
asking for the implementation of isDisabled() and after that for the
implementation of getForm(). I'm afraid it's asking for every abstract
method present in AbstractFormComponent. Shouldn't Tapestry automatically
create them in the enhanced subclass? I looked at code from various other
form components and I couldn't find out what is it I'm doing wrong. I'm
pretty sure Tapestry does not require the component class to implement these
methods. This is not the first form component I've written, but it's the
first one that gave me trouble.

 

I'm using Tapestry 3.0.3 (but I had the same problem in 3.0.2).

 

 

Here's some of the stack trace in case it might be useful:

 


Stack Trace:


*
org.apache.tapestry.enhance.DefaultComponentClassEnhancer.validateEnhancedCl
ass(DefaultComponentClassEnhancer.java:203) 

*
org.apache.tapestry.enhance.DefaultComponentClassEnhancer.constructComponent
Class(DefaultComponentClassEnhancer.java:146) 

*
org.apache.tapestry.enhance.DefaultComponentClassEnhancer.getEnhancedClass(D
efaultComponentClassEnhancer.java:97) 

*
org.apache.tapestry.pageload.PageLoader.instantiateComponent(PageLoader.java
:603) 

*
org.apache.tapestry.pageload.PageLoader.createImplicitComponent(PageLoader.j
ava:569) 

*
org.apache.tapestry.BaseComponentTemplateLoader.createImplicitComponent(Base
ComponentTemplateLoader.java:295) 

*
org.apache.tapestry.BaseComponentTemplateLoader.process(BaseComponentTemplat
eLoader.java:237) 

*
org.apache.tapestry.BaseComponentTemplateLoader.process(BaseComponentTemplat
eLoader.java:172) 

*
org.apache.tapestry.BaseComponent.readTemplate(BaseComponent.java:100) 

*
org.apache.tapestry.BaseComponent.finishLoad(BaseComponent.java:135) 

*
org.apache.tapestry.pageload.PageLoader.constructComponent(PageLoader.java:5
19) 

*
org.apache.tapestry.pageload.PageLoader.loadPage(PageLoader.java:764) 

*
org.apache.tapestry.pageload.PageSource.getPage(PageSource.java:152) 

*
org.apache.tapestry.engine.RequestCycle.getPage(RequestCycle.java:195) 

 

Any ideas?

 

Denis Souza

 

Reply via email to